首页 > 代码库 > [Java]#从头学Java# Java大整数相加

[Java]#从头学Java# Java大整数相加

重操旧业,再温Java,写了个大整数相乘先回顾回顾基本知识。算法、效率什么的都没怎么考虑,就纯粹实现功能而已。

先上代码:

 1 package com.tacyeh.common;
 2 
 3 public class MyMath {
 4 
 5     public static String BigNumSum(String... n) {
 6         int length = n.length;
 7         StringBuilder result = new StringBuilder();
 8         //这里判断其实不需要,因为Add里面已经做了处理
 9         /*if (length == 1) {
10             result.append(n[0]);
11         } else {
12             for (int i = 0; i < length; i++) {
13                 Add(result, n[i]);
14             }
15         }*/
16         for (int i = 0; i < length; i++) {
17             Add(result, n[i]);
18         }
19         return result.toString();
20     }
21 
22     // 将数字string加至result中
23     private static void Add(StringBuilder result, String string) {
24         // 如果result为空,则不需要相加直接将string添加进去即可
25         if (result.length() == 0) {
26             result.append(string);
27             return;
28         }
29         StringBuilder s1 = new StringBuilder(result.toString());
30         StringBuilder s2 = new StringBuilder(string);
31         //逆序两个数字
32         s1.reverse();
33         s2.reverse();
34         //清空result,用以存放结果
35         result.delete(0, result.length());
36         int maxLength = s1.length() >= s2.length() ? s1.length() : s2.length();
37         // 进位标记
38         int carry = 0;
39         for (int i = 0; i < maxLength; i++) {
40             int n1 = 0, n2 = 0;
41             if (s1.length() > i) {
42                 n1 = s1.charAt(i) - ‘0‘;
43             }
44             if (s2.length() > i) {
45                 n2 = s2.charAt(i) - ‘0‘;
46             }
47             //计算两数对应位之和,并加上进位上来的数字
48             int sum = n1 + n2 + carry;
49             //如果无进位,则直接将sum作为结果,有进位则取余为结果
50             if (sum < 10) {
51                 result.append(sum);
52             } else {
53                 result.append(sum % 10);
54             }
55             //存储进位下次加至sum中
56             carry = sum / 10;
57         }
58         //若两数相加最终会向最高位进位,则将进位加至结果中
59         if (carry != 0) {
60             result.append(carry);
61         }
62         //重新逆序得到相加结果
63         result.reverse();
64     }
65 }

 

 

    代码个人觉得还算清晰,BigNumSum方法使用不定长参数以便于进行多个大整数相加,真正计算全在Add里面。有问题请不吝指教。

我写了个随机数字(不大的整数)测试,大概测了下没有异常:

 1 package com.tacyeh.common;
 2 
 3 public class Test {
 4 
 5     public static void main(String[] args) {
 6         int num1, num2, num3;
 7         for (int i = 0; i < 11; i++) {
 8             num1 = (int)(Math.random()*1000000);
 9             num2 = (int)(Math.random()*10000000);
10             System.out.println(String.format("参考结果:  %d + %d = %d", num1, num2, num1 + num2));
11             System.out.println(String.format("计算结果:  %d + %d = %s", num1, num2, MyMath.BigNumSum(num1+"", num2+"")));
12         }
13 
14         for (int i = 0; i < 11; i++) {
15             num1 = (int)(Math.random()*1000000);
16             num2 = (int)(Math.random()*10000000);
17             num3 = (int)(Math.random()*1000000000);
18             System.out.println(String.format("参考结果:  %d + %d + %d = %d", num1, num2, num3, num1 + num2 + num3));
19             System.out.println(String.format("计算结果:  %d + %d + %d = %s", num1, num2, num3,  MyMath.BigNumSum(num1+"", num2+"", num3 + "")));
20         }
21     }
22 }

结果示例:

 1 参考结果:  656405 + 9080280 = 9736685
 2 计算结果:  656405 + 9080280 = 9736685
 3 参考结果:  922986 + 7698921 = 8621907
 4 计算结果:  922986 + 7698921 = 8621907
 5 参考结果:  629313 + 7816715 = 8446028
 6 计算结果:  629313 + 7816715 = 8446028
 7 参考结果:  273994 + 7913142 = 8187136
 8 计算结果:  273994 + 7913142 = 8187136
 9 参考结果:  659146 + 3001331 = 3660477
10 计算结果:  659146 + 3001331 = 3660477
11 参考结果:  837469 + 4587465 = 5424934
12 计算结果:  837469 + 4587465 = 5424934
13 参考结果:  470568 + 6860168 = 7330736
14 计算结果:  470568 + 6860168 = 7330736
15 参考结果:  822342 + 7793830 = 8616172
16 计算结果:  822342 + 7793830 = 8616172
17 参考结果:  160316 + 8353945 = 8514261
18 计算结果:  160316 + 8353945 = 8514261
19 参考结果:  687841 + 9943578 = 10631419
20 计算结果:  687841 + 9943578 = 10631419
21 参考结果:  578712 + 7372111 = 7950823
22 计算结果:  578712 + 7372111 = 7950823
23 参考结果:  46621 + 1110969 + 233974530 = 235132120
24 计算结果:  46621 + 1110969 + 233974530 = 235132120
25 参考结果:  148252 + 6427111 + 817102144 = 823677507
26 计算结果:  148252 + 6427111 + 817102144 = 823677507
27 参考结果:  714230 + 9416781 + 372323772 = 382454783
28 计算结果:  714230 + 9416781 + 372323772 = 382454783
29 参考结果:  623342 + 137310 + 165272255 = 166032907
30 计算结果:  623342 + 137310 + 165272255 = 166032907
31 参考结果:  722800 + 3442193 + 822635821 = 826800814
32 计算结果:  722800 + 3442193 + 822635821 = 826800814
33 参考结果:  995006 + 1934487 + 311100730 = 314030223
34 计算结果:  995006 + 1934487 + 311100730 = 314030223
35 参考结果:  793812 + 4501416 + 231740793 = 237036021
36 计算结果:  793812 + 4501416 + 231740793 = 237036021
37 参考结果:  37730 + 354688 + 948028135 = 948420553
38 计算结果:  37730 + 354688 + 948028135 = 948420553
39 参考结果:  969339 + 4083304 + 595032908 = 600085551
40 计算结果:  969339 + 4083304 + 595032908 = 600085551
41 参考结果:  519930 + 5746212 + 843022611 = 849288753
42 计算结果:  519930 + 5746212 + 843022611 = 849288753
43 参考结果:  497529 + 7835996 + 351860170 = 360193695
44 计算结果:  497529 + 7835996 + 351860170 = 360193695

分割线以上是正文,下面是胡谝了。

#2014-05-01 一个人静静思考#2012年7月毕业,和多数人一样,去了大城市——北京,做了半年的Delphi“开发”,那段时间忙碌但还算可以,因为毕竟是人生中第一份工作,自己能赚一点生活费了。但是这样的状态保持了没多久,年底离开后回到西安,做了一份与“软件工程”专业毫无关系的工作,如果非要找点相近的那就是给公司做了个静态网站+偶尔PS改图之类的,呵呵……现在想想自己这状态,不知道有多可笑,现在又重新踏上程序猿道路。重拾开发,算是从头开始好好干。

以后每天至少学习一个小时,做一道题。