JAVA实现两个大数相乘

自己用JAVA实现的大数相乘——稻草人

代码:

import java.util.Scanner;

public class bigNumMultiply {

	/**
	 * 实现两个大数相乘
	 * @param args
	 */
	public static final int MAX_LEN = 10000000;
	public static int[] tempArray1 = new int[MAX_LEN];
	public static int[] tempArray2 = new int[MAX_LEN];//这两个数组用来暂时存储局部结果
	//初始化数组函数
	public static void Init()
	{
		for(int i=0;i<MAX_LEN;i++)
		{
			tempArray1[i] = 0;
			tempArray2[i] = 0;
		}
	}
	//实现大数相乘的函数
	public static String mul(String num1,String num2)
	{
		String result = "";
		int len1 = num1.length();
		int len2 = num2.length();
		int tempNum1 = 0,tempNum2 = 0;//num1和num2里拆出来相乘的单个数
		int pre = 0;//进位,初始化为0
		int mulRes = 0;//乘积
		for(int i=0;i<len2;i++)
		{
			int loc_begin = 0;//往数组里存放一轮计算结果的开始位置
			tempNum2 = num2.charAt(i)-'0';
			for(int j=0;j<len1;j++)
			{
				tempNum1 = num1.charAt(j)-'0';
				mulRes = tempNum1*tempNum2+pre;
				if(i==0)
				{
					if(j==len1-1){//一轮计算结束
						tempArray1[loc_begin] = mulRes;
						pre = 0;//一轮存储完毕,进位置0
					}
					else//一轮计算没有结束
					{
						pre = mulRes/10;//进位
						tempArray1[loc_begin] = mulRes%10;//进位后保存结果	
						
					}
					loc_begin++;
				}
				else
				{
					if(j==len1-1){//一轮计算结束
						tempArray2[loc_begin] = mulRes;
						pre = 0;//一轮存储完毕,进位置0
					}
					else//一轮计算没有结束
					{
						pre = mulRes/10;//进位
						tempArray2[loc_begin] = mulRes%10;//进位后保存结果	
					}
					loc_begin++;
				}
			}
			if(i>0)
			{
				
				posSum(i,loc_begin-1);//错位求和,结果存放在tempArray1中,i是错位数	
			}
		}
		boolean boo = true;
		for(int k=tempArray1.length-1;k>=0;k--)
		{
			
			if(tempArray1[k]==0 && boo)
			{
					continue;
			}	
			else
			{
				boo = false;
				result = result+tempArray1[k];
			}
		}
		if(result=="")
			result = "0";
		return result;
	}
	//错位求和
	public static void posSum(int n,int len)
	{
		int pre = 0;
		int sum = 0;
		int i=0;
		int j=0;
		while(true)
		{
			if(i>=n)
			{
				sum = tempArray1[i] + tempArray2[j] + pre;
				if(j<len)
				{
					tempArray1[i] = sum%10;
					pre = sum/10;
				}
				if(j==len)
				{
					tempArray1[i] = sum;
					break;
				}
				j++;
			}
			i++;
		}
	}
	public String getMulRes(String num1,String num2)
	{
		boolean boo = true;//标记结果是否是正数,初始化假设是正数
		String result = null;//存放两个大数相乘的结果。
		//判断两个大数均为负数
		if(num1.charAt(0)=='-' && num2.charAt(0)=='-')
		{
			num1 = (String)num1.subSequence(1, num1.length());
			num2 = (String)num2.subSequence(1, num2.length());
		}
		else if(num1.charAt(0)=='-' || num2.charAt(0)=='-')//其中一个为负数
		{
			boo = false;//一正一负,结果为负数。
			if(num1.charAt(0)=='-')
			{
				num1 = (String)num1.subSequence(1, num1.length());
			}
			else if(num2.charAt(0)=='-')
			{
				num2 = (String)num2.subSequence(1, num2.length());
			}
		}
		num1 = reverse(num1);
		num2 = reverse(num2);
		if(num1.length()<=num2.length())
			result = mul(num2,num1);
		else
			result = mul(num1,num2);
		if(!boo&&!result.equals("0"))//如果结果为负数,则在前面加‘-’号
			result = "-"+result;
		return result;
	}
	//字符串取反,如:(123-->321),方便之后求积
	public static String reverse(String str)
	{
		char[] strarray = str.toCharArray();
		StringBuffer sbf = new StringBuffer();
		for (int i = strarray.length - 1; i >= 0; i--)
			sbf.append(strarray[i]);
		return sbf.toString();
	}
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		bigNumMultiply multiply = new bigNumMultiply();
		System.out.println("请输入第一个大数:");
		while(in.hasNext())
		{	
			Init();//初始化,数组置0
			String strNum1 = in.next();
			System.out.println("请输入第二个大数:");
			String strNum2 = in.next();
			System.out.println(strNum1+"*"+strNum2+" = "+multiply.getMulRes(strNum1,strNum2));
			System.out.println("请输入第一个大数:");
		}
		

	}

}
 

 

测试数据:

 

请输入第一个大数:
123456789
请输入第二个大数:
987654321
123456789*987654321 = 121932631112635269
请输入第一个大数:
10000
请输入第二个大数:
10000
10000*10000 = 100000000
请输入第一个大数:
87654321
请输入第二个大数:
123455666677
87654321*123455666677 = 10821422636174761317
请输入第一个大数:
4566000
请输入第二个大数:
10001
4566000*10001 = 45664566000
请输入第一个大数:
-78655443122
请输入第二个大数:
98765411222
-78655443122*98765411222 = -7768437184792961515084

 

结果是0的测试数据:

请输入第一个大数:
0
请输入第二个大数:
0
0*0 = 0
请输入第一个大数:
-99
请输入第二个大数:
0
-99*0 = 0
请输入第一个大数:
0
请输入第二个大数:
788
0*788 = 0
请输入第一个大数:
* 限于个人水平,代码比较复杂,同求效率较高的代码。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值