[Java]#从头学Java# Java大整数相加
时间:2014-05-02 13:02:39
收藏:0
阅读:396
重操旧业,再温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改图之类的,呵呵……现在想想自己这状态,不知道有多可笑,现在又重新踏上程序猿道路。重拾开发,算是从头开始好好干。
以后每天至少学习一个小时,做一道题。
评论(0)