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); } }
相关推荐
(2)进行矩阵相加、相减、相乘运算 (3)进行三角函数、阶乘运算 (4)其他功能,略 设计要求: (1)基于C语言,采用面向过程程序设计思想,通过设计业务流程,将设计中待实现的功能划分成若干个子模块,并逐个...
1. **大数相加**:大数相加通常通过模拟手工加法的过程来实现,逐位进行,并考虑进位。每个数字可以表示为字符串或自定义的数组结构,以便存储任意长度的数字。对于负数结果,需要额外处理负号。 2. **大数相减**:...
以两个大数A和B为例,首先将这两个数按照位数进行对齐,然后从最低位开始依次相加或相减,并记录进位或借位情况。这一过程类似于小学数学中的竖式加减法。 #### 大数乘法 大数乘法可以采用分治的思想,将一个大数...
阶乘:计算这个数的阶乘 倒数:计算分数的倒数 平方:计算这个数的平方 立方:计算这个数的立方 方差:计算这五个数的方差 • 程序员模式 十进制:计算这个数的八进制和二进制 八进制:计算这个数的十进制和二进制 ...
基本步骤是:先记录开始时间,执行待测代码,然后记录结束时间,两者相减得到程序运行时间。 实验要求学生编写相应的C程序,实现上述算法,并通过实际运行和时间测量来验证算法的效率。通过这个实验,学生不仅能够...
对于各种运算的实现,例如高精度加法和减法,首先比较两个数的符号,根据符号进行相应操作,然后逐位相加或相减并处理进位或退位。高精度乘法通过逐位相乘和错位相加来完成。对于高精度除法,通过遍历每一位找出满足...
- 加法:通过相加两个浮点数(d1+d2)并格式化输出结果(%.16g)。 - 减法:通过相减两个浮点数(d1-d2)并格式化输出结果。 - 乘法:通过相乘两个浮点数(d1*d2)并格式化输出结果。 - 除法:注意处理除以零的...
2. **逐位相加**:从最低位开始,对两个字符串进行逐位相加,并处理进位。 3. **结果输出**:将得到的每一位逆序输出,形成最终结果。 ### 5. 字符串相减(大数相减) #### 函数定义: ```c void sub(char s1[], ...
4. 四则运算:大数的加减法需要考虑到符号和小数点的位置,确保数字对齐后进行逐位相加或相减。乘法可以使用扩展的学校乘法算法,而除法则相对复杂,可能需要使用迭代或搜索方法来确定商和余数。 5. 阶乘运算:大数...
通过将两个方程相加或相减可以消去一个变量,从而解出另一个。在这个例子中,x + y = 2 和 x - y = 1 组成的方程组可以通过相加得到2x = 3,进而解出x = 3/2。将x的值代入任一方程求得y = 1/2,所以正确答案是C。 2...
求解数列的和可以采用直接求和、分组求和、错位相减等方法。例如,题目中的数列求和题,可以通过观察数列的规律,找出每个项与前一项的关系,进而得到通项公式,进一步求和。 5. **几何图形的构造与计数**: 图形...
8. **阶乘和**:计算一系列阶乘的和,需要进行多次高精度乘法和加法运算,同时处理阶乘的累积大整数。 9. **高精度求积**:输入两个大整数,求它们的乘积。这可以通过长乘法或优化算法如Karatsuba或Toom-Cook来实现...
如果字符为大写或小写字母,字符值将与4进行相减操作,再判断是否需要将其循环到字母表的末尾。循环结束后,输出加密或解密后的字符。 2. 输出乘法表 该程序输出了一个9x9的乘法表。通过嵌套循环分别控制行与列,...
遍历矩阵,分别累加主对角线和副对角线的元素,然后相减。 5. 删除非字母字符: 读取字符串,使用条件判断保留英文字母,删除其他字符。 第三次作业: 1. 分段函数求值: 根据输入的x值,选择正确的函数部分,...
8. **数组运算**:给定两个数组`a`和`b`,计算对应元素相减和相加的结果的乘积,结果存入`c`数组。可以使用两层循环,分别执行加法和减法操作,然后将结果相乘。 9. **成绩分段统计**:根据考试成绩分段统计人数,...
2. 实现两个输入的十进制数的运算,例如相减、相乘或相除。设计思路包括: - 主程序:调用输入、计算和显示的子程序,使用`JMP`构成循环以进行多次计算。 - 子程序`surb1`:负责键盘输入,将ASCII码转换为十进制数...
"Python基础代码题目抽查" 本文档包含了20个Python基础代码题目,涵盖了基本的算法、数据结构、逻辑控制等知识点。通过这些题目,读者可以加深...可以使用循环控制来计算每天的钱数,并将其相加或相减,以显示谁赚了。
3. 实现加法和减法运算,可以类似于链表节点的相加和相减,但要注意进位和借位的处理。 4. 实现乘法运算,关键在于处理乘数和被乘数结点的移动以及进位。 5. 实现除法运算,需要特别注意处理好除数和被除数的顺序,...