问题描述
输入两个整数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都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
定义一个数组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的值。
输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
输出格式
输出一行,表示a + b的值。
样例输入
20100122201001221234567890
2010012220100122
样例输出
20100122203011233454668012
20100122201001221234567890
2010012220100122
样例输出
20100122203011233454668012
---------------------------------------------------------------------------------------------------------------------------------
这道题看似简单,实际上,要考虑的问题有很多,比如输入的加数和被加数的值如何分割到数组中,我原来的做法是输入两个整数,然后再利用数学公式把这个数的每一位都分解出来,分割到数组的每一个位置。这样做超级麻烦,主要是我用循环的方法还做不出来……所以最后放弃了这样的做法。
这道题最好用数组和字符串结合来做,相加最后的结果存在一个数组中,输入的数用字符串来表示,因为在字符串中封装了已经写好的函数方法,我们可以直接调用。比如,length() substring()等。
直接贴代码吧:
import java.util.Scanner;
public class GaoJingdu {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int []k = new int[101];
String a = cin.nextLine();
String b = cin.nextLine();
int []c = new int[100];
int []d = new int[100];
for(int i = 0;i<a.length();i++){ //倒存a的值并分割到数组中。
c[a.length()-1-i] = Integer.parseInt(a.substring(i,i+1));
}
for(int i = 0;i<b.length();i++){ //倒存b的值并分割到数组中。
d[b.length()-1-i] = Integer.parseInt(b.substring(i,i+1));
}
for(int i = 0;i<100;i++){ //两数相加
k[i] = c[i] + d[i];
}
for(int i = 0;i<100;i++){ //相加进位
if(k[i]>=10){
k[i+1] += k[i]/10;
k[i] = k[i]/10;
}
}
int f = 0;
for(int i = 100;i>=0;i--){ //判断数组k的大小,有多少位数就显示多少位结果。
if(k[i]>0){
f = i;
break;
}
}
for(int t = f;t>=0;t--){
System.out.print(k[t]);
}
}
}
有一个大胆的想法,假如不按照题目的要求来做的话,两个高精度的数相加的代码其实很简单,利用math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。
import java.util.Scanner;
import java.math.BigDecimal;
public class GaoJingdu {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
BigDecimal m;
BigDecimal n;
BigDecimal l;
m = cin.nextBigDecimal();
n = cin.nextBigDecimal();
l = m.add(n);
System.out.println(l);
}
}
虽然这样做也可以,但是就是不知道在蓝桥杯的测试环境下用例能不能通过,因为高精度加法是VIP题,我还不能进去查看和答题,所以也不能确定对不对。不过为了保险起见,我们还是不能偷懒,用字符串和数组来做吧。