java大数相乘

本文详细介绍了一种高效的大数乘法算法,并提供了详细的代码实现。通过将大数拆分为字符数组,逐一相乘后再整合的方式,实现了任意大小整数的乘法运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://blog.youkuaiyun.com/sunkun2013/article/details/11822927


   为了方便画图及说明,图以两小数1234和3456相乘为例,大数的思路等同。

思路图解

Step 1:

 

 

Step 2:

Step 3:

   

Step 4:

 

    思路清晰了,下面就应该进行具体的代码实现了。

具体代码实现:

做了两个类成员方法函数,分别为①doMul(String,String):String和②doMul(char[],char[]):int[]

①doMul(String,String):String

[html]  view plain  copy
  1. <pre class="java" name="code"><pre class="java" name="code">/*  
  2. 大整数乘法的转换函数  
  3. */  
  4. public static String doMul(String data1,String data2) {  
  5.       int i = 0,j = 0;  
  6.       if(data1.charAt(0) == '-') {  
  7.                 data1 = data1.substring(1);//去掉大整数前面的负号  
  8.                 i++;  
  9.           }  
  10.           
  11.       if(data2.charAt(0) == '-') {  
  12.                 data2 = data2.substring(1);//去掉大整数前面的负号  
  13.                 j++;  
  14.         }  
  15.          char[] char1 = data1.toCharArray();     
  16.          char[] char2 = data2.toCharArray();  
  17.            
  18.          int[] result = doMul(char1,char2);  
  19.          String jieguo = "";  
  20.            
  21.          if(i+j == 1) {  
  22.                  jieguo = "-";  
  23.                  for(int k = 0; k < char1.length + char2.length-1; k++)  {  
  24.                          jieguo += result[k];  
  25.                  }  
  26.              }else {  
  27.                   for(int k = 0; k<char1.length+char2.length-1; k++)  {  
  28.                          jieguo += result[k];  
  29.                  }  
  30.          }  
  31.          return jieguo;  
  32. }</pre><br><br></pre>  

②doMul(char[],char[]):int[]

[java]  view plain  copy
  1. /* 
  2. 高精度乘法函数 
  3. */  
  4. public static int[] doMul(char[] char1 , char[] char2) {  
  5.           
  6.         int[] a = new int[char1.length];  
  7.         int[] b = new int[char2.length];  
  8.         int[] result = new int[char1.length + char2.length-1];  
  9.         int[][] c = new int[char1.length][char2.length];  
  10.         String jieguo = "";//最终结果的字符串形式  
  11.           
  12.         for(int i = 0; i<char1.length ; i++) {  
  13.                 a[i] = Integer.parseInt(char1[i] + "");  
  14.         }  
  15.         for(int i = 0; i<char2.length ; i++) {  
  16.                 b[i] = Integer.parseInt(char2[i] + "");  
  17.         }  
  18.           
  19.         for(int i = 0; i<char1.length ; i++) {  
  20.                 for(int j = 0; j<char2.length; j++) {  
  21.                        c[i][j] = a[i] * b[j];//将大整数一位一位相乘  
  22.                 }  
  23.         }  
  24.           
  25.         int k = 0;  
  26.         while(k < char1.length+char2.length-1) {  
  27.                 for(int i = 0; i<char1.length; i++) {  
  28.                         for(int j = 0; j<char2.length; j++) {  
  29.                                 if(i+j == k) {  
  30.                                         result[k] += c[i][j];  
  31.                                 }  
  32.                         }  
  33.                 }  
  34.                 k++;  
  35.         }  
  36.           
  37.         for(int i = char1.length+char2.length-1-1; i>0 ;i--) {  
  38.                 if(result[i] > 9){  
  39.                         result[i-1] += result[i] / 10;  
  40.                         result[i] = result[i] % 10;  
  41.                 }  
  42.         }  
  43.         return result;  
  44. }  


③compare(String,String):boolean  // 因为①中包含了,所以在此解释一下

[java]  view plain  copy
  1. /* 
  2. 字符串比较函数,比较两字符串长度大小 
  3. */  
  4. public static boolean compare(String data1 , String data2) {  
  5.         int i = 0;  
  6.         if(data1.length() > data2.length()) {  
  7.                 return false;  
  8.         }else {  
  9.                 i = data1.compareTo(data2);  
  10.                 if(i > 0) {  
  11.                         return false;  
  12.                 }else {  
  13.                         return true;  
  14.                 }  
  15.         }  
  16. }  

备注:

    如果用Java自带类库写函数就很方便了,下面也一并附上自带类库所写程序。

[java]  view plain  copy
  1. import java.math.BigInteger;  
  2.   
  3. public class BigNumberLibrary {  
  4.   
  5.     /** 
  6.      * @param args 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         // TODO Auto-generated method stub  
  10.   
  11.         BigInteger a = new BigInteger("997945672345647898769");  
  12.         BigInteger b = new BigInteger("59164562345721340329");  
  13.   
  14.             System.out.println("两大数运算结果为:");  
  15.           
  16.         BigInteger c = a.add(b);  
  17.         BigInteger d = a.subtract(b);  
  18.         BigInteger e = a.multiply(b);  
  19.         BigInteger f = a.divide(b); // 若除数为0,程序会自动抛出异常  
  20.         BigInteger g = a.remainder(b);  
  21.           
  22.             System.out.println(a + " + " + b + " = " + c);    
  23.                 System.out.println(a + " - " + b + " = " + d);  
  24.             System.out.println(a + " * " + b + " = " + e);  
  25.         System.out.println(a + " / " + b + " = " + f);  
  26.         System.out.println(a + " % " + b + " = " + g);  
  27.     }  
  28. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值