转自: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
- <pre class="java" name="code"><pre class="java" name="code">/*
- 大整数乘法的转换函数
- */
- public static String doMul(String data1,String data2) {
- int i = 0,j = 0;
- if(data1.charAt(0) == '-') {
- data1 = data1.substring(1);//去掉大整数前面的负号
- i++;
- }
- if(data2.charAt(0) == '-') {
- data2 = data2.substring(1);//去掉大整数前面的负号
- j++;
- }
- char[] char1 = data1.toCharArray();
- char[] char2 = data2.toCharArray();
- int[] result = doMul(char1,char2);
- String jieguo = "";
- if(i+j == 1) {
- jieguo = "-";
- for(int k = 0; k < char1.length + char2.length-1; k++) {
- jieguo += result[k];
- }
- }else {
- for(int k = 0; k<char1.length+char2.length-1; k++) {
- jieguo += result[k];
- }
- }
- return jieguo;
- }</pre><br><br></pre>
②doMul(char[],char[]):int[]
- /*
- 高精度乘法函数
- */
- public static int[] doMul(char[] char1 , char[] char2) {
- int[] a = new int[char1.length];
- int[] b = new int[char2.length];
- int[] result = new int[char1.length + char2.length-1];
- int[][] c = new int[char1.length][char2.length];
- String jieguo = "";//最终结果的字符串形式
- for(int i = 0; i<char1.length ; i++) {
- a[i] = Integer.parseInt(char1[i] + "");
- }
- for(int i = 0; i<char2.length ; i++) {
- b[i] = Integer.parseInt(char2[i] + "");
- }
- for(int i = 0; i<char1.length ; i++) {
- for(int j = 0; j<char2.length; j++) {
- c[i][j] = a[i] * b[j];//将大整数一位一位相乘
- }
- }
- int k = 0;
- while(k < char1.length+char2.length-1) {
- for(int i = 0; i<char1.length; i++) {
- for(int j = 0; j<char2.length; j++) {
- if(i+j == k) {
- result[k] += c[i][j];
- }
- }
- }
- k++;
- }
- for(int i = char1.length+char2.length-1-1; i>0 ;i--) {
- if(result[i] > 9){
- result[i-1] += result[i] / 10;
- result[i] = result[i] % 10;
- }
- }
- return result;
- }
③compare(String,String):boolean // 因为①中包含了,所以在此解释一下
- /*
- 字符串比较函数,比较两字符串长度大小
- */
- public static boolean compare(String data1 , String data2) {
- int i = 0;
- if(data1.length() > data2.length()) {
- return false;
- }else {
- i = data1.compareTo(data2);
- if(i > 0) {
- return false;
- }else {
- return true;
- }
- }
- }
备注:
如果用Java自带类库写函数就很方便了,下面也一并附上自带类库所写程序。
- import java.math.BigInteger;
- public class BigNumberLibrary {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- BigInteger a = new BigInteger("997945672345647898769");
- BigInteger b = new BigInteger("59164562345721340329");
- System.out.println("两大数运算结果为:");
- BigInteger c = a.add(b);
- BigInteger d = a.subtract(b);
- BigInteger e = a.multiply(b);
- BigInteger f = a.divide(b); // 若除数为0,程序会自动抛出异常
- BigInteger g = a.remainder(b);
- System.out.println(a + " + " + b + " = " + c);
- System.out.println(a + " - " + b + " = " + d);
- System.out.println(a + " * " + b + " = " + e);
- System.out.println(a + " / " + b + " = " + f);
- System.out.println(a + " % " + b + " = " + g);
- }
- }