Java实现大数相乘

大数相乘算法,可以避免因得数过大超过数据范围而显示错误的问题。
我所使用的大数相乘算法为逐位相乘处理进位法,主要运用了数组倒序和数组数组移动的方法。
大致原理为:如12345×678,先将12345和678倒序,然后相乘,每一位的结果为相乘后的结果加上上一位的进位:

得到结果后,将三个得数数组进行移动然后相加,这一步可以同步执行:

在这里插入图片描述
最后的结果逆序输出,即为答案。
代码实现:

import java.util.Scanner;

public class Multiplication {

public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	int multiplier1 = in.nextInt();//较大乘数
	int multiplier2 = in.nextInt();//较小乘数
	in.close();
	//把输入的乘数转化为字符串
	String m1 = multiplier1 + "";
	String m2 = multiplier2 + "";
	//把输入的乘数转化为字符数组
	char[] mul1 = m1.toCharArray();
	char[] mul2 = m2.toCharArray();
	//把输入的乘数转化为整形数组
	int[] x1 = new int[mul1.length];
	int[] x2 = new int[mul2.length];
	for(int i=0;i<x1.length;i++) {
		x1[i] = mul1[i] - '0';
	}
	for(int i=0;i<x2.length;i++) {
		x2[i] = mul2[i] - '0';
	}
	//将数组倒序
	reverseArray(x1);
	reverseArray(x2);
	int carry1 = 0;//乘数相乘的进位
	int carry2 = 0;//得数相加的进位
	int[] head = new int[x1.length+x2.length-1];
	for(int i=0;i<x2.length;i++) {
		int[] temp = new int[x1.length+x2.length-1];//temp数组用来保存乘数相乘后的结果
		for(int j=0;j<x1.length;j++) {
			temp[j] = (x1[j]*x2[i]+carry1)%10;//保存每个相乘的得数
			carry1 = (x1[j]*x2[i]+carry1)/10;//保存进位
			if((j == x1.length-1) &&(i != 0))  {
				move(temp, i);//先对得数数组进行移动
				for(int k=0;k<head.length;k++) {
					int headtemp = head[k];//保存head数组当前位,防止在下一步被覆盖
					head[k] = (head[k]+temp[k]+carry2)%10;//保存每个相加的得数
					carry2 = (headtemp+temp[k]+carry2)/10;//保存进位
				}
				//初始化进位
				carry1 = 0;
				carry2 = 0;
			}
			else if((j==x1.length-1) && (i==0)) {//第一次相加时,直接将得数数组复制到head数组就行,无需进行相加操作
				for(int k=0;k<head.length;k++) {
					head[k] = temp[k];
				}
			}
		}
	}
	//倒序输出结果
	for(int i=head.length-1;i>=0;i--) {
		System.out.print(head[i]);
	}
}
//将数组倒序的方法
public static void reverseArray(int Array[]) {
	int last = Array.length-1;
	for(int first=0;first<last;first++) {
		int temp = Array[first];
		Array[first] = Array[last];
		Array[last] = temp;
		last--;
	}
}
//将数组移动的方法
public static void move(int Array[],int n) {
	int[] temp = new int[n];//temp数组保存每次移动后被覆盖的数
	for(int i=0;i<n;i++) {
		temp[i] = Array[Array.length-(i+1)];
	}
	int j=Array.length-n-1;
	//将数组进行移动
	for(int i=Array.length-1;i>(n-1);i--) {
		Array[i] = Array[j];
		j--;
	}
	//将被覆盖的数放在数组空出来的位置
	for(int i=0;i<n;i++) {
		Array[i] = temp[n-(i+1)];
	}
}
}

此次记录到此结束。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值