问题描述
输入两个整数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
PS:在写程序的时候需要考虑,进位两次的时候(即后者进位,导致前者进位),还有一点要注意的是最高位需要进位.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner (System.in);
String a=sc.next();
String b=sc.next();
int[] arr_intA = new int[a.length()];
int[] arr_intB = new int[b.length()];
//使用截取字符串的方法将每一个字符都转换为int类型,继而将其倒叙存到int数组中
for (int i = 0; i < a.length(); i++) {
arr_intA[a.length() - i - 1] = Integer.parseInt(a.substring(i, i + 1));
}
for (int i = 0; i < b.length(); i++) {
arr_intB[b.length() - i - 1] = Integer.parseInt(b.substring(i, i + 1));
}
//使用字符传 --> char数组 --> int数组
/*
//将用户输入的a,b存起来
char[] arr_charA = a.toCharArray();
char[] arr_charB = b.toCharArray();
//由char类型转换为int类型
for(int i=0; i<arr_charA.length;i++) {
arr_intA[i] = arr_charA[i]-'0';
}
for(int i=0; i<arr_charA.length;i++) {
arr_intB[i] = arr_charB[i]-'0';
}
*/
//用来存相加结果
int[] arrRes = new int[101];
//用长数组 -->作为循环条件
int length = arr_intA.length > arr_intB.length ? arr_intA.length :arr_intB.length;
//进位值
int jiwei = 0;
//将两个倒叙的int[]对应位数相加
for(int i=0;i<length;i++)
{
int num1 = 0,num2 = 0;
//若长度够,则取值,
if(arr_intA.length > i){
num1 = arr_intA[i];
}
if(arr_intB.length > i){
num2 = arr_intB[i];
}
//做加法 数1 + 数2 + 进位值
int temp = num1 + num2 + jiwei;
arrRes[i] = temp%10; //最终该位置的值
jiwei = temp/10; //进位使用
}
//若进位不为0则最高位数还需进位1 -> 如:(218+838)
if(jiwei != 0){
arrRes[length] = jiwei;
}
/*
System.out.println("计算后的数组:");
for(int i=0; i<arrRes.length;i++) {
System.out.print(arrRes[i]);
}
*/
//由上结果可以看出,找出倒数第一个非0位,然后逆向输出即是结果
int index=0;
for(int i=arrRes.length-1;i>=0 ;i--) {
if(arrRes[i]!=0) {
index=i;//非0的倒数第一个位的数组索引
break;
}
}
//逆向输出结果 : 个十百千 --> 千百十个
for(int i=index; i>=0;i--) {
System.out.print(arrRes[i]);
}
}
}