`

阶乘,阶乘相加,阶乘相减

阅读更多
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语言,采用面向过程程序设计思想,通过设计业务流程,将设计中待实现的功能划分成若干个子模块,并逐个...

    c++大数模板,加减乘除阶乘求幂N进制

    1. **大数相加**:大数相加通常通过模拟手工加法的过程来实现,逐位进行,并考虑进位。每个数字可以表示为字符串或自定义的数组结构,以便存储任意长度的数字。对于负数结果,需要额外处理负号。 2. **大数相减**:...

    大数运算\大数高精度计算

    以两个大数A和B为例,首先将这两个数按照位数进行对齐,然后从最低位开始依次相加或相减,并记录进位或借位情况。这一过程类似于小学数学中的竖式加减法。 #### 大数乘法 大数乘法可以采用分治的思想,将一个大数...

    使用C语言实现简单计算器

    阶乘:计算这个数的阶乘 倒数:计算分数的倒数 平方:计算这个数的平方 立方:计算这个数的立方 方差:计算这五个数的方差 • 程序员模式 十进制:计算这个数的八进制和二进制 八进制:计算这个数的十进制和二进制 ...

    实验指导书1-对算法运行时间的认识.docx

    基本步骤是:先记录开始时间,执行待测代码,然后记录结束时间,两者相减得到程序运行时间。 实验要求学生编写相应的C程序,实现上述算法,并通过实际运行和时间测量来验证算法的效率。通过这个实验,学生不仅能够...

    C语言课程设计(简易计算器设计)带所有代码.docx

    对于各种运算的实现,例如高精度加法和减法,首先比较两个数的符号,根据符号进行相应操作,然后逐位相加或相减并处理进位或退位。高精度乘法通过逐位相乘和错位相加来完成。对于高精度除法,通过遍历每一位找出满足...

    实训一计算器编程的实现.doc

    - 加法:通过相加两个浮点数(d1+d2)并格式化输出结果(%.16g)。 - 减法:通过相减两个浮点数(d1-d2)并格式化输出结果。 - 乘法:通过相乘两个浮点数(d1*d2)并格式化输出结果。 - 除法:注意处理除以零的...

    c语言代码——ACM常用算法

    2. **逐位相加**:从最低位开始,对两个字符串进行逐位相加,并处理进位。 3. **结果输出**:将得到的每一位逆序输出,形成最终结果。 ### 5. 字符串相减(大数相减) #### 函数定义: ```c void sub(char s1[], ...

    c语言程序设计报告-超大数据的运算.doc

    4. 四则运算:大数的加减法需要考虑到符号和小数点的位置,确保数字对齐后进行逐位相加或相减。乘法可以使用扩展的学校乘法算法,而除法则相对复杂,可能需要使用迭代或搜索方法来确定商和余数。 5. 阶乘运算:大数...

    Mathematics Knowledge - ASVAB Section Six Mathematics Knowledge题库.docx

    通过将两个方程相加或相减可以消去一个变量,从而解出另一个。在这个例子中,x + y = 2 和 x - y = 1 组成的方程组可以通过相加得到2x = 3,进而解出x = 3/2。将x的值代入任一方程求得y = 1/2,所以正确答案是C。 2...

    2015高中数学 2.1合情推理与演绎推理练习 新人教A版选修2-2

    求解数列的和可以采用直接求和、分组求和、错位相减等方法。例如,题目中的数列求和题,可以通过观察数列的规律,找出每个项与前一项的关系,进而得到通项公式,进一步求和。 5. **几何图形的构造与计数**: 图形...

    高精度习题汇总[文].pdf

    8. **阶乘和**:计算一系列阶乘的和,需要进行多次高精度乘法和加法运算,同时处理阶乘的累积大整数。 9. **高精度求积**:输入两个大整数,求它们的乘积。这可以通过长乘法或优化算法如Karatsuba或Toom-Cook来实现...

    c语言程序实例.pdf

    如果字符为大写或小写字母,字符值将与4进行相减操作,再判断是否需要将其循环到字母表的末尾。循环结束后,输出加密或解密后的字符。 2. 输出乘法表 该程序输出了一个9x9的乘法表。通过嵌套循环分别控制行与列,...

    C语言程序设计-作业与答案.docx

    遍历矩阵,分别累加主对角线和副对角线的元素,然后相减。 5. 删除非字母字符: 读取字符串,使用条件判断保留英文字母,删除其他字符。 第三次作业: 1. 分段函数求值: 根据输入的x值,选择正确的函数部分,...

    C语言程序设计上机考试题目汇编.pdf

    8. **数组运算**:给定两个数组`a`和`b`,计算对应元素相减和相加的结果的乘积,结果存入`c`数组。可以使用两层循环,分别执行加法和减法操作,然后将结果相乘。 9. **成绩分段统计**:根据考试成绩分段统计人数,...

    第五次汇编语言实验报告-子程序设计.docx

    2. 实现两个输入的十进制数的运算,例如相减、相乘或相除。设计思路包括: - 主程序:调用输入、计算和显示的子程序,使用`JMP`构成循环以进行多次计算。 - 子程序`surb1`:负责键盘输入,将ASCII码转换为十进制数...

    2201班Python基础代码题目抽查.docx

    "Python基础代码题目抽查" 本文档包含了20个Python基础代码题目,涵盖了基本的算法、数据结构、逻辑控制等知识点。通过这些题目,读者可以加深...可以使用循环控制来计算每天的钱数,并将其相加或相减,以显示谁赚了。

    用c语言实现超长整数的四则运算

    3. 实现加法和减法运算,可以类似于链表节点的相加和相减,但要注意进位和借位的处理。 4. 实现乘法运算,关键在于处理乘数和被乘数结点的移动以及进位。 5. 实现除法运算,需要特别注意处理好除数和被除数的顺序,...

Global site tag (gtag.js) - Google Analytics