public class Test { private static int m = 1000; private static int[] data = new int[m]; // 第一位存储数的长度,从第二位开始依次从低位向高位存储每位数字 private static int[] carry = new int[m];// 存储每次乘积的进位 private static int[] attData = new int[m]; /** * 初始化数组data */ static void init() { int i; for (i = 2; i <= (m - 1); i++) { data[i] = 0; data[0] = 1;// 开始只有1位数 data[1] = 1;// 0的阶乘为1 } } /** * * * @param iStartIndex * 调整的起始位置 * @param iPlus * 进位值 * @param array * 要调整的数组 */ static void adj_carry(int iStartIndex, int iPlus, int array[]) { while (array[iStartIndex] + iPlus >= 10)// 向高位进 { array[iStartIndex] = (array[iStartIndex] + iPlus) % 10; iPlus = (array[iStartIndex] + iPlus) / 10; iStartIndex++; } array[iStartIndex] += iPlus; } /** * 用当前的数每别乘以data数组里从第二位开始的数,同时完成进位 * * @param i * @param iNum */ static void goon(int i, int iNum)// i:当前乘的位数 M-1>= i >=1; iNum:当前的阶乘子 { int iTotal = data[i] * iNum;// 当前的总数 data[i] = iTotal % 10; if (iTotal >= 10) { adj_carry(i + 1, iTotal / 10, carry);// 调整进位数组 } } /** * 调整阶乘位数 */ static void adj_total() { int i; for (i = m - 1; i >= data[0]; i--) if (data[i] > 0) { data[0] = i;// 共有i位 break; } } /** * 将进位加至和数数组 */ static void add_carry_to_data() { int i; int iTotal; for (i = 1; i <= m - 1; i++) { iTotal = data[i] + carry[i]; data[i] = iTotal % 10; if (iTotal >= 10)// 进位 { adj_carry(i + 1, iTotal / 10, data);// 调整进位数组 } } } /** * 进位数组清0 */ static void clear_carry() { int i; for (i = 1; i <= m - 1; i++) carry[i] = 0; } /** * 阶乘 * * @param iNum */ static void Mul(int iNum) { init(); int i, j; for (i = 1; i <= iNum; i++) { for (j = 1; j <= data[0]; j++) goon(j, i); add_carry_to_data();// 将进位数组加至和数组 adj_total();// 调整总位数 clear_carry();// 清0进位数组,准备下一次阶乘 } } /** * 阶乘 * * @param iNum */ static void Mul(int iNum, boolean flag) { init(); int i, j; for (i = 1; i <= iNum; i++) { for (j = 1; j <= data[0]; j++) goon(j, i); add_carry_to_data();// 将进位数组加至和数组 adj_total();// 调整总位数 clear_carry();// 清0进位数组,准备下一次阶乘 } System.out.print(iNum + "!="); for (i = data[0]; i >= 1; i--) { System.out.print(data[i]); } System.out.println(); System.out.println(); } // 加法 static void add(int iNum, int jNum) { System.out.println(); System.out.print(iNum + "!+" + jNum + "!="); Mul(iNum); // 得到 2个阶乘的数组 加数为mainData 被加数为data for (int i = 0; i < m - 1; i++) { attData[i] = data[i]; } Mul(jNum); int i; int num = attData[0] > data[0] ? attData[0] : data[0]; for (i = 1; i < num; i++) { addStart(i); } add_carry_to_data();// 将进位数组加至和数组 adj_total();// 调整总位数 clear_carry();// 清0进位数组,准备下一次阶乘 for (i = data[0]; i >= 1; i--) { System.out.print(data[i]); } System.out.println(); } // 减法 // 3 - 5 static void sub(int iNum, int jNum) { System.out.print(iNum + "!-" + jNum + "!="); String flag = ""; // 得到 2个阶乘的数组 减数为data 被减数为attData if (iNum < jNum) { // iNum大 Mul(iNum); for (int i = 0; i < m - 1; i++) { attData[i] = data[i]; } Mul(jNum); flag = "-"; } else if (iNum > jNum) { // jNum大 Mul(jNum); for (int i = 0; i < m - 1; i++) { attData[i] = data[i]; } Mul(iNum); } else { data[1] = 0; } int i; for (i = 1; i < data[0]; i++) { subStart(i); } add_carry_to_data();// 将进位数组加至和数组 adj_total();// 调整总位数 clear_carry();// 清0进位数组,准备下一次阶乘 // -86280才是对的 System.out.print(flag); for (i = data[0]; i >= 1; i--) { System.out.print(data[i]); } System.out.println(); init(); } static void subStart(int i)// i:当前乘的位数 M-1>= i >=1; iNum:当前的阶乘子 { // 6 // -120 int iTotal = data[i] - attData[i];// 当前的总数 if (iTotal < 0) { data[i] = 10 + iTotal; adj_carry(i + 1, -1, carry);// 调整进位数组 } else { data[i] = iTotal; } } static void addStart(int i)// i:当前乘的位数 M-1>= i >=1; iNum:当前的阶乘子 { int iTotal = attData[i] + data[i];// 当前的总数 data[i] = iTotal % 10; if (iTotal >= 10) { adj_carry(i + 1, iTotal / 10, carry);// 调整进位数组 } } public static void main(String[] args) { Mul(5, true); Mul(3, true); sub(3, 5); sub(5, 3); add(3, 5); } }
相关推荐
java阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘
JAVA实现1-10之间的数字的阶乘并且相加。简单的小程序
C语言实现求两个数的阶乘 C语言实现求两个数的阶乘
阶乘 阶乘计算 大数阶乘 大整数阶乘 用数组计算阶乘
阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,...
(2)进行矩阵相加、相减、相乘运算 (3)进行三角函数、阶乘运算 (4)其他功能,略 设计要求: (1)基于C语言,采用面向过程程序设计思想,通过设计业务流程,将设计中待实现的功能划分成若干个子模块,并逐个...
整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,0的阶乘为1。即:n!=1×2×3×…×n。 首先导入math模块,然后调用factorial()函数来计算阶乘。 1 math.factorial(x) import math value = math....
大数相乘大数相加大数阶乘代码 完全解决代码简易 容易理解 有什么缺点欢迎评论 交流
100阶乘100阶乘100阶乘100阶乘100阶乘100阶乘100阶乘100阶乘
阶乘算法 阶乘问题 C# 小程序 这个是我用C#写的一个校程序,阶乘问题, 是以前学编程时写的,希望代码对大家有所帮助!
阶乘相加for型.exe
一个比较简单的调用函数实例,对于新手来说,易于理解!
N进制大数相减,大数比较,大数乘法,大数乘浮点数(支持大数乘大数),大数阶乘,大数相加,大数相减(负数结果带符号),大数相减,大数之差(绝对值),浮点大数求幂(支持整数大数求幂),整数大数求幂
安徽大学计算机组成原理课程设计微程序实现阶乘
Labview应用技术 n的阶乘(FOR课堂实训)1.docx 学习资料 复习资料 教学资源
题解:求n的阶乘末尾0的数量。因为n的阶乘容易爆整数范围,所以普通算法不合适。用高精度容易超时,这里直接给出数学求解过程
求阶乘-c#编写的求阶乘的控制台应用程序,有利于锻炼初学者的逻辑思维能力。
用双向链表实现大数阶乘 输入一个不限制大小的数 即可计算出它的阶乘
1至n各自阶乘之和,适宜初学者代码使用,并非最优仅供参考,谢谢合作
1091:求阶乘的和 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 22935 通过数: 17332 【题目描述】 给定正整数n,求不大于n的正整数的阶乘的和(即求1!+2!+3!+...+n!),输出阶乘的和。 【输入】 输入有一行,...