华为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 }