`

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

阅读更多
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);
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics