大数乘法

使用java语言的int数组与StringBuffer来实现

日常中,我们使用java来计算两数乘法时,我们会在遇到一些比较大的数字计算时,便无可奈何(int不够大),这时一般采用BigInteger的方法进行计算,但是该方法也有一定的限制,或者说,我们是可以去尝试去使用String来实现和表示大数乘法的效果。

编程思路:

首先我们要确定使用字符串后我们如何去实现我们的乘法计算,不妨我们回归竖式计算,进行模拟然后得出结果。

例如:37*46的计算过程,我们也可以这样计算:如下图。

  1. 先不考虑进位的问题,将两个数字相乘的结果当作一个个位数(不去进行进位,最后再依次进位,方便计算机操作,当然,方法多样,并不局限于此)

    在这里插入图片描述

  2. 我们也可以发现上述规律a位数*b位数≤(a+b)位数

    所以我们如果需要得到最后的位数的话,可以通过这个规律进行计算。

代码:

首先,我们采用由俭入繁的理念:从简单的开始,再到复杂:

  1. 我们考虑的是两个正整数的大数乘法:

    //大数乘法
    import java.util.*;
    public class Main {
    		public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		String a = sc.nextLine();
    		String b = sc.nextLine();
    		//注意:这里直接将数字计算后的结果相加起来了,直接得到最后一行
    		int[] s = new int[b.length()+a.length()];
    		System.out.print(a+" * "+b+" = ");
    		for (int i = b.length()-1; i >= 0; i--) {
    			for (int k = a.length()-1; k >= 0; k--) {
    				int t = (b.charAt(i)-'0')*(a.charAt(k)-'0');
    				s[s.length-1-(a.length()-1-k+(b.length()-1-i))] += t;
    			}
    		}
    		//进位计算
    		for(int i=s.length-1;i>0;i--)
    		{
    			if(s[i]>=10){
    				s[i-1] +=s[i]/10;
    				s[i]=s[i]%10;
    			}
    		}
    		//清空前置零(int转向StringBuffer的时候可能会多0),并使用字符串表示出答案
    		StringBuffer ans = new StringBuffer();
    		for (int i : s) {
    			ans.append(i);
    		}
    		while(ans.charAt(0)=='0'){
    			ans.deleteCharAt(0);
    		}
    		System.out.println(ans);
    		sc.close();		
    	}
     
    }
    
  2. 好的计算成功,那么如果有负数存在呢?

    我们只需要加上如下的判断符号的代码即可

    //判断符号
    		Boolean flag = true; 
    		if(a.charAt(0)=='-'&&b.charAt(0)=='-')
    			{
    				a = a.substring(1);
    				b = b.substring(1);
    				flag = true;
    			}
    
    		if(a.charAt(0)!='-'&&b.charAt(0)!='-'){
    				flag = true;
    			}
    			
    
    		if(a.charAt(0)=='-'&&b.charAt(0)!='-')
    			{
    				a = a.substring(1);
    				flag =  false;
    			}
    		if(a.charAt(0)!='-'&&b.charAt(0)=='-')
    		{
    				b = b.substring(1);
    				flag =  false;
    		}
    
    		if(!flag)System.out.print("-");
    

完整的代码如下:

//大数乘法(有符号)
import java.util.*;
public class Main {
		
		public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String a = sc.nextLine();
		String b = sc.nextLine();
		System.out.print(a+" * "+b+" = ");
		//判断符号
		Boolean flag = true; 
		if(a.charAt(0)=='-'&&b.charAt(0)=='-')
			{
				a = a.substring(1);
				b = b.substring(1);
				flag = true;
			}

		if(a.charAt(0)!='-'&&b.charAt(0)!='-'){
				flag = true;
			}
			

		if(a.charAt(0)=='-'&&b.charAt(0)!='-')
			{
				a = a.substring(1);
				flag =  false;
			}
		if(a.charAt(0)!='-'&&b.charAt(0)=='-')
		{
				b = b.substring(1);
				flag =  false;
		}

		if(!flag)System.out.print("-");

		//注意:这里直接将数字计算后的结果相加起来了直接得到最后一行
		int[] s = new int[b.length()+a.length()];
		for (int i = b.length()-1; i >= 0; i--) {
			for (int k = a.length()-1; k >= 0; k--) {
				int t = (b.charAt(i)-'0')*(a.charAt(k)-'0');
				s[s.length-1-(a.length()-1-k+(b.length()-1-i))] += t;
			}
		}
		//进位计算
		for(int i=s.length-1;i>0;i--)
		{
			if(s[i]>=10){
				s[i-1] +=s[i]/10;
				s[i]=s[i]%10;
			}
		}
		//清空前置零(int转向StringBuffer的时候可能会多0),并使用字符串表示出答案
		StringBuffer ans = new StringBuffer();
		for (int i : s) {
			ans.append(i);
		}
		while(ans.charAt(0)=='0'){
			ans.deleteCharAt(0);
		}
		System.out.println(ans);
		sc.close();		
	}
 
}

最后:bugs:

在初步形成之后,还是有一些bug的比如乘数中含有0,那么就会报错。

所以要排除这一情况。(在判断符号前加入一个判断0即可)

代码:

//大数乘法
import java.util.*;
public class Main {
		
		public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String a = sc.nextLine();
		String b = sc.nextLine();
		System.out.print(a+" * "+b+" = ");
		//判断0
		if(a.equals("0")||b.equals("0"))System.out.println("0");
		else {
		//判断符号
		Boolean flag = true; 
		if(a.charAt(0)=='-'&&b.charAt(0)=='-')
			{
				a = a.substring(1);
				b = b.substring(1);
				flag = true;
			}

		if(a.charAt(0)!='-'&&b.charAt(0)!='-'){
				flag = true;
			}
			

		if(a.charAt(0)=='-'&&b.charAt(0)!='-')
			{
				a = a.substring(1);
				flag =  false;
			}
		if(a.charAt(0)!='-'&&b.charAt(0)=='-')
		{
				b = b.substring(1);
				flag =  false;
		}

		if(!flag)System.out.print("-");

		//注意:这里直接将数字计算后的结果相加起来了直接得到最后一行
		int[] s = new int[b.length()+a.length()];
		for (int i = b.length()-1; i >= 0; i--) {
			for (int k = a.length()-1; k >= 0; k--) {
				int t = (b.charAt(i)-'0')*(a.charAt(k)-'0');
				s[s.length-1-(a.length()-1-k+(b.length()-1-i))] += t;
			}
		}
		//进位计算
		for(int i=s.length-1;i>0;i--)
		{
			if(s[i]>=10){
				s[i-1] +=s[i]/10;
				s[i]=s[i]%10;
			}
		}
		//清空前置零(int转向StringBuffer的时候可能会多0),并使用字符串表示出答案
		StringBuffer ans = new StringBuffer();
		for (int i : s) {
			ans.append(i);
		}
		while(ans.charAt(0)=='0'){
			ans.deleteCharAt(0);
		}
		System.out.println(ans);
		sc.close();	
		}	
	}
 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值