`
heisedeyueya
  • 浏览: 96555 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

大整数乘法

 
阅读更多
package org.iSun.heisedeyueya;

public class BigIntegerMultiply {
	public static void main(String args[]) {
		String s1 = "51212126";
		String s2 = "22434565";
		System.out.println(51212126L * 22434565L);
		bigIntegerMultiply(s1, s2);
	}

	public static void bigIntegerMultiply(String a, String b) {
		char[] c1 = a.toCharArray();
		char[] c2 = b.toCharArray();
		int[] integer1 = new int[c1.length];
		int[] integer2 = new int[c2.length];
		// 将字符转换成int类型
		for (int i = 0; i < c1.length; i++) {
			integer1[i] = c1[i] - 48;
		}
		for (int i = 0; i < c2.length; i++) {
			integer2[i] = c2[i] - 48;
		}
		// 存放结果的数组
		int[] result = new int[integer1.length + integer2.length];

		// 每一轮计算中个位的偏移量
		int offset = 0;
		// 乘数的个位到高位顺序取出
		for (int i = integer2.length - 1; i >= 0; i--) {
			// 这一轮乘积的个位数的位置
			int index = offset;
			// 进位
			int count = 0;
			// 模数
			int mod = 0;
			// 被乘数的个位到高位顺序取出
			for (int j = integer1.length - 1; j >= 0; j--) {
				// 乘积加上上一轮的进位
				int temp = integer2[i] * integer1[j] + count;
				// 求模数
				mod = temp % 10;
				// 求进位
				count = temp / 10;
				// 这一轮的模数与本为对其的位求和
				result[result.length - 1 - index] = mod
						+ result[result.length - 1 - index];
				// 求和之后可能进位位的值可能改变,刷新进位位的值
				count = count + result[result.length - 1 - index] / 10;
				// 将新的模数填入到相应的位
				result[result.length - 1 - index] = (result[result.length - 1
						- index]) % 10;
				index++;
			}
			// 本轮计算完成将进位位直接填入到当前的位置
			result[result.length - 1 - index] = count;
			// 偏移量加
			offset++;
		}

		for (int i = 0; i < result.length; i++) {
			System.out.print(result[i]);
		}

	}
}

分享到:
评论
1 楼 clarkhuang 2012-10-09  
学习了

相关推荐

Global site tag (gtag.js) - Google Analytics