华为OJ平台——超长正整数相加

题目描述:

  请设计一个算法完成两个超长正整数的加法。

输入

  输入两个字符串数字

输出

  输出相加后的结果,string型

样例输入

  99999999999999999999999999999999999999999999999999 1

样例输出

  100000000000000000000000000000000000000000000000000

 

思路:

  在Java中,这样的大数运算可以直接用BigInteger类中的方法来进行运算和处理,那样本题没有任何意义了

  因此在本方法中,不直接采用该类中的方法进行运算,直接在字符串中进行逐位运算的方法来得到结果

 1 import java.util.Scanner;
 2 
 3 /**
 4  * 请设计一个算法完成两个超长正整数的加法。
 5 输入
 6   输入两个字符串数字
 7 输出
 8   输出相加后的结果,string型
 9 样例输入
10   99999999999999999999999999999999999999999999999999 1
11 样例输出
12   100000000000000000000000000000000000000000000000000
13  *
14  */
15 public class BigDataAdd {
16 
17     public static void main(String[] args) {
18         //输入,读取两个字符串
19         Scanner cin = new Scanner(System.in) ;    
20         String num1 = cin.next() ;
21         String num2 = cin.next() ;
22         cin.close() ;
23                 
24         System.out.println(addBigdata(num1,num2));
25 
26     }
27 
28     /**
29      * 该方法完成运算,返回字符串结果
30      * @param num1
31      * @param num2
32      * @return
33      */
34     private static String addBigdata(String num1, String num2) {
35         int last = 0 ;
36         //用StringBuilder来添加运算结果
37         StringBuilder sb = new StringBuilder() ;
38         int len1 = num1.length() ;
39         int len2 = num2.length() ;
40         int now1 ;  //保存字符串num1中当前运算的 位 的值
41         int now2 ;
42         int res ;  //保存当前位的运算结果
43         for(int i = len1-1, j = len2-1 ; i >= 0 || j >= 0; i--,j--){
44             //获取当前num1的当前运算位的值,
45                         //当最高位超过本串的长度时,设为0
46             if( i >= 0){
47                 now1 = num1.charAt(i) - '0' ;
48             }else{
49                 now1 = 0 ;
50             }
51             //获取当前num2的当前运算位的值,当最高位超过本串的长度时,设为0
52             if( j >= 0){
53                 now2 = num2.charAt(j) - '0' ;
54             }else{
55                 now2 = 0 ;
56             }
57             //计算结果,两个当前位以及进位值相加
58             res = now1 + now2 + last ;
59             //当当前位的计算结果大于等于10时需要进位,
60                         //置进位标志位1,保存的计算结果则取个位的值
61             if(res >= 10){
62                 last = 1 ;
63                 res = res - 10 ;                
64             }
65             sb.append(res) ;
66             
67             res = 0 ;            
68         }
69         //最高位运算结束后,若有进位,则应保存结果
70         if(last != 0){            
71             sb.append(last) ;
72         }
73         //上面的结果是从个位一次向高位保存的,
74                // 所以正在的结果需要反转一下
75         return sb.reverse().toString() ;        
76     }
77 }
Code

 

posted on 2016-06-19 19:25  mukekeheart  阅读(767)  评论(0编辑  收藏  举报