1563: 高精度加法

来源:互联网 发布:mac口红质地 编辑:程序博客网 时间:2024/05/16 13:41

题目描述

输入两个整数ab,输出这两个整数的和。ab都不超过100位。

算法描述

由于ab都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
定义一个数组AA[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b
计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
最后将C输出即可。

输入

输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。

输出

输出一行,表示b的值。

样例输入

201001222010012212345678902010012220100122

样例输出

20100122203011233454668012
import java.util.*;public class Main {    static  Scanner in=new Scanner(System.in);   public static void main(String[] args) {          while(in.hasNext()){          String s1=in.next();          String s2=in.next();          int k;          if(s1.length()>s2.length()){         k=s1.length()-s2.length();            for (int i = 0; i<k; i++)   s2="0"+s2;          }          else if(s1.length()<s2.length()){          k=s2.length()-s1.length();              for (int i = 0; i <k; i++)  s1="0"+s1;            }          int cnt=Math.max(s1.length(),s2.length());          int[] a=new int[cnt];          int[] b=new int[cnt];          int[] c=new int[cnt];          for (int i = 0; i < cnt; i++) {a[i]=s1.charAt(i)-'0';b[i]=s2.charAt(i)-'0';}            int r=0;          int i=cnt-1;              while(i>=0){                  c[i]=(a[i]+b[i]+r)%10;              if(a[i]+b[i]+r>=10){              r=0;              r+=1;              }              else              r=0;                i--;              }      if(c[0]==0)    System.out.print("1");            for (int j =0; j<c.length; j++) System.out.print(c[j]);            System.out.println();          }                }        } 

反思:这么简单的题也是绝了,我竟然做了好久,服气了,可能是太久没有刷题了吧,算起来也有两个周了,我的错咯,哎,
本题我犯得最蠢的错误就是,开始我进行字符串对齐操作的时候,令i<s1.length()-s2.length(),可是我忽略了我后来一直在改变
字符串长度啊,s2="0"+s2,真是绝了,还有后来进位,注意要把进位置零,以及最后一位的处理,若满足进位,要优先输出1,最后一遍,一定要注意变量的值随时变化,注意保护一些变量的值!!!!   
原创粉丝点击