java实现大数相乘

计算大数:1234567891011121314151617181920 X 2019181716151413121110987654321?

 

 

计算结果:2492816912877266687794240983772975935013386905490061131076320; length=61

验证结果:2.4928169128772666E60

 

源代码如下:

/**
 * 计算大数相乘
 * @author zhoujianghai
 * zhoujiangbohai@163.com
 */
public class BigNumberCount {

	 public static void main(String agrs[]){
	 String number1 = "1234567891011121314151617181920";
	 String number2 = "2019181716151413121110987654321";
	  String result = multipBigNumber(number1,number2);
	  System.out.println("计算结果:"+result+"; length="+result.length());
	  System.out.println("验证结果:"+Double.parseDouble(number1) * Double.parseDouble(number2));
	 }
	
	 public static String multipBigNumber(String s1,String s2){
		  int longArray[] = null;
		  int shortArray[] = null;
		  int s1Length = s1.length();
		  int s2Length = s2.length();
		  int longLength = s1Length > s2Length ? s1Length : s2Length;
		  int shortLength = s1Length == longLength ? s2Length : s1Length;
		  longArray = new int[longLength];
		  shortArray = new int[shortLength];
		  String longString = s1Length >= s2Length ? s1 : s2; 
		  String shortString = s1.equals(longString) ? s2 : s1;
		  System.out.println("longString="+longString+"; shortString="+shortString); 
		  //低位在前,高位在后
		  for(int i = longLength - 1; i >= 0; i --){
			  longArray[longLength - 1 - i] = longString.charAt(i) - 48; 
		  }
		  for(int i = shortLength - 1; i >= 0; i --){
			  shortArray[shortLength - 1 - i] = shortString.charAt(i) - 48;
		  }
		 
		  StringBuffer results[] = new StringBuffer[longLength];
		  for(int i = 0; i < results.length; i++) {
			  results[i] = new StringBuffer();
	    	}
		  StringBuffer resultBuffer = new StringBuffer();
	   
		  /**
		   * 把被乘数的每一位与乘数逐位相乘
		   * 如:5607 * 2256,被乘数5607,乘数2256
		   * 7 * 6 + 0 = 42 :0表示低位向高位的进位
			 7 * 5 + 4 = 39
             7 * 2 + 3 = 17
             7 * 2 + 1 = 15
             29751
             0 * 6 + 0 = 0
             0 * 5 + 0 = 0
             0 * 2 + 0 = 0
			 0 * 2 + 0 = 0
			 00000
			 6 * 6 + 0 = 36
			 6 * 5 + 3 = 33
			 6 * 2 + 3 = 15
			 6 * 2 + 1 = 13
			 63531
			 5 * 6 + 0 = 30
			 5 * 5 + 3 = 28
			 5 * 2 + 2 = 12
			 5 * 2 + 1 = 11
			 08211
		   *  results:29751, 00000,63531,08211
		   * */
		  for(int i = 0; i < longLength; i ++){
		   int temp = 0;
		   int tempCarry = 0;//低位向高位的进位
		   int currentValue = 0; //当前位乘积的值
			   for(int j = 0; j < shortLength; j ++){
				  
				    temp = longArray[i] * shortArray[j] + tempCarry;
				    //System.out.println("longArray[i]="+longArray[i]+" * "+"shortArray[j]="+shortArray[j]+" + "+tempCarry+" = "+temp); 
				    tempCarry = temp / 10;
				    currentValue = temp % 10;
				    results[i].append(currentValue);
				    if(j == shortLength - 1){
				     results[i].append(tempCarry);//最高位有进位则进位,无进位则补0
				    }
			   }
			  System.out.println( results[i].toString()); 
		  }
		 /**低位补0,results[i]低位补i个0(低位在前,高位在后)
		  * 29751
			000000
			0063531
			00008211
		  *  */
		  for(int i = 0,length = results.length;i < length; i++){
		   String temp = "";
		   for(int j = 0; j < i; j ++){
		    temp += "0";
		   }
		   results[i].insert(0, temp);
		   System.out.println( results[i].toString()); 
		  }

		   /**把每一行相加(低位在前,高位在后,从左往右 加)
		  * 29751
			000000
			0063531
			00008211
		  -------------
		    29394621 
		    * 
		    * */
		  int tempCarry = 0;
		  int currentValue = 0; 
		  StringBuffer lastBuffer = results[results.length - 1];
		 //需要循环的次数  
        int times =  lastBuffer.length();  
       
        for(int i = 0; i < times; i ++ ){  
            int temp = 0;  
            for(int j = 0,length2 = results.length; j < length2; j ++){  
                if(results[j].length() > i){  
                    temp += (results[j].charAt(i) - 48);//把第j行的第i位的字符转换成int  
                }  
            }  
            temp += tempCarry;  
            tempCarry = temp / 10;  
            currentValue = temp % 10;  
            resultBuffer.append(currentValue);  
        }  

        StringBuffer finalResult = new StringBuffer();  

        boolean hasNumNotZero = false;
        //因为低位在前,高位在后,所以把29394621 转换成最终结果:12649392  
        for(int i = resultBuffer.length() - 1; i >= 0; i --) {  
            int temp  = resultBuffer.charAt(i) - 48;  
            if(temp != 0) hasNumNotZero = true;
            if (hasNumNotZero) finalResult.append(temp);    
        }  
        if (finalResult.length() == 0) finalResult.append(0);
        return finalResult.toString();  

    }  
}

 

 

 

 

转帖请注明出处:

 http://zhoujianghai.iteye.com/blog/1168264

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值