首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java兑现大数相乘

2012-10-20 
java实现大数相乘计算大数:1234567891011121314151617181920 X 2019181716151413121110987654321???计算结

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(低位在前,高位在后)  * 29751000000006353100008211  *  */  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());   }   /**把每一行相加(低位在前,高位在后,从左往右 加)  * 29751000000006353100008211  -------------    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

?

1 楼 faulware 2012-06-25   本以为这么长的代码 肯定考虑了结果位数的问题,结果.... StringBuffer results[] = new StringBuffer[longLength];   那么13*9结果是2位数吗??? 2 楼 zhoujianghai 2012-06-25   faulware 写道本以为这么长的代码 肯定考虑了结果位数的问题,结果.... StringBuffer results[] = new StringBuffer[longLength];   那么13*9结果是2位数吗???
多谢指出错误,是循环的次数times弄错了,不需要减1,已纠正。不过StringBuffer results[] = new StringBuffer[longLength]这行代码是没有错误的,这个results里存储的不是结果的位数,是两数逐位相乘的结果,看看代码里的注释。results:29751, 00000,63531,08211 。

热点排行