AILAB免费训练
【问题描述】
输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
【算法描述】
由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
定义一个数组A,A[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。
【输出格式】
输出一行,表示a + b的值。
【样例输入】
20100122201001221234567890
2010012220100122
【样例输出】
20100122203011233454668012
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static Scanner sc=new Scanner(System.in);
public static void main(String[] args) {
// TODO Auto-generated method stub
String stra,strb=new String();// 声明2个String对象来装在2个加数a,b
stra=sc.nextLine();
strb=sc.nextLine();
int[] a=new int[stra.length()];
int[] b=new int[strb.length()];
// 根据题目意思,A[0]装a的个位,A[1]装a的十位……所以需要将字符串进行反转(因为个位在字符串末尾)
for(int i=0;i<stra.length();i++){
a[a.length-1-i]=(stra.charAt(i)-48);
}
for(int i=0;i<strb.length();i++){
b[b.length-1-i]=(strb.charAt(i)-48);
}
// 下面就应该进行加法运算了 ,对于结果C的长度,应该是2个加数的最大位数+1。
int maxLen=a.length > b.length ?a.length : b.length;
int[] c=new int[maxLen+1];
//用来规定2个数加法的次数
int minLen=a.length < b.length ?a.length : b.length;
int r=0;//用来保存整数部分
for(int i=0;i<minLen;i++){
int temp=a[i]+b[i]+r;//进行加法
r=temp/10;//十位数的保存,保存进位
c[i]=temp%10;//保存个位
}
if(a.length>b.length){//如果a的位数比b多,则把a的数字放进c里面去
for(int i=b.length;i<maxLen;i++){//从b.length开始操作
int temp=a[i]+r;
r=temp/10;
c[i]=temp%10;
}
}else if(a.length<b.length){
for(int i=a.length;i<maxLen;i++){//从b.length开始操作
int temp=b[i]+r;
r=temp/10;
c[i]=temp%10;
}
}
if(r!=0){//如果r还有值的话,就讲r加在最高为上
c[c.length-1]+=r;
}
//判断一下最高位是否为0,如果为0就把0给去掉
if(c[c.length-1]==0){
c=Arrays.copyOfRange(c, 0, c.length-1);//从original数组的下标from开始复制,到下标to结束
}
for(int i=0;i<c.length;i++){
System.out.print(c[c.length-1-i]);//逆向输出,输出数值
}
}
}