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 }