1 package cn.sice; 2 3 import java.math.BigInteger; 4 5 public class BigMathDemo 6 { 7 8 public static void main(String[] args) 9 { 10 for (int i = 0; i < 1000; i++) 11 { 12 // 建立测试随机数用 Math.random()方法 13 String s1 = Long 14 .toString((long) (Math.random() * 1000000000 * 1000000000)); 15 String s2 = Long 16 .toString((long) (Math.random() * 1000000000 * 1000000000)); 17 // 建立超大数... 18 // s1 = 19 // "5467899342090975667578996657155768966241787596787296625767889"; 20 // s2 = "98714252890652468818789890687248909926791226256725678"; 21 // java自带大数类,用于验算结果 22 BigInteger b = new BigInteger(s1); 23 // java计算结果r1 24 String r1 = b.add(new BigInteger(s2)).toString(); 25 26 BigMath bm = new BigMath(s1, s2); 27 // 计算结果r2 28 String r2 = bm.sum(); 29 if (!r1.equals(r2)) 30 { 31 sop(s1 + " + " + s2); 32 sop("BigInteger = " + r1); 33 sop("BigMath = " + r2); 34 } else 35 { 36 sop(true); 37 } 38 39 } 40 41 } 42 43 void method() 44 { 45 int max1 = Integer.MAX_VALUE; 46 int max2 = Integer.MAX_VALUE; 47 int sum = max1 + max2; 48 sop(sum);// -2 49 // 证明 大数情形下 int 越界了 50 } 51 52 // 牛B方法,不解释 53 public static void sop(Object obj) 54 { 55 System.out.println(obj); 56 } 57 58 } 59 60 class BigMath 61 { 62 private int[] arr1; 63 private int[] arr2; 64 // 进位标志 65 private boolean addFlag = false; 66 67 public BigMath(String s1, String s2) 68 { 69 arr1 = changeToIntArr(s1); 70 arr2 = changeToIntArr(s2); 71 } 72 73 // 将字符串转化为int类型数组 74 private int[] changeToIntArr(String s) 75 { 76 int[] arr = new int[s.length()]; 77 for (int i = 0; i < s.length(); i++) 78 { 79 // 把一个字符串里的数字字符变成数字: 80 // 1,先用charAt(index)方法变成char 81 // 2,然后用String.valueOf(char)方法变成单字符的String 82 // 3,再用Integer.parseInt(String)变成int类型 83 arr[i] = Integer.parseInt(String.valueOf(s.charAt(s.length() - i 84 - 1))); 85 } 86 return arr; 87 } 88 89 public String sum() 90 { 91 int length1 = arr1.length; 92 int length2 = arr2.length; 93 int length; 94 String[] arrResult; 95 if (length1 >= length2) 96 { 97 // 数组长度+1,避免最高位进位,超出数组位数 98 length = length1 + 1; 99 } else 100 { 101 length = length2 + 1; 102 } 103 arrResult = new String[length]; 104 for (int i = 0; i < length; i++) 105 { 106 int t1 = 0; 107 int t2 = 0; 108 109 if (i < length1) 110 { 111 // 取出相同位置的数 112 t1 = arr1[i]; 113 } 114 if (i < length2) 115 { 116 // 取出相同位置的数 117 t2 = arr2[i]; 118 } 119 // 求和 120 int sum = t1 + t2; 121 // 判断是否进位 122 if (addFlag) 123 { 124 sum += 1; 125 } 126 // 为下一次求和,设置标志位 127 if ((sum / 10) > 0) 128 { 129 addFlag = true; 130 } else 131 { 132 addFlag = false; 133 } 134 // 将计算结果保存在数组中 135 arrResult[i] = Integer.toString(sum % 10); 136 } 137 // 将计算结果转换成字符串 138 StringBuffer sb = new StringBuffer(); 139 for (int j = arrResult.length - 1; j >= 0; j--) 140 { 141 // 数组存放的顺序是小的角标对应低位,变成字符串高位在前,取大角标 142 sb.append(arrResult[j]); 143 } 144 // 如果两数相加,两数位数一样,有没产生进位,由于避免进位多了一位,要去掉,去掉的就是数组默认初始化的0 145 if (sb.charAt(0) == '0') 146 { 147 return sb.substring(1, sb.length()); 148 } 149 return sb.toString(); 150 } 151 152 }