zoukankan      html  css  js  c++  java
  • 华为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
  • 相关阅读:
    编程总结2
    编程总结3
    《秋季学期学习总结》
    《人生路上对我影响最大的三位老师》
    第八周编程总结
    第七周编程总结
    第六周编程总结
    第五周作业
    第四周编程总结
    第三周编程总结
  • 原文地址:https://www.cnblogs.com/mukekeheart/p/5598632.html
Copyright © 2011-2022 走看看