基础练习 高精度加法
时间限制:1.0s 内存限制:512.0MB
问题描述
输入两个整数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.Scanner;
import java.util.Arrays;
public class Main {
static Scanner s = new Scanner(System.in);
public static void main(String[] args) {
String strA, strB = new String(); // 声明2个String对象来装在2个加数a,b
strA = s.nextLine();
strB = s.nextLine();
int[] A = new int[strA.length()]; // 定义个A数组
int[] B = new int[strB.length()]; // 定义个B数组
// 根据题目意思,A[0]装a的个位,A[1]装a的十位……所以需要将字符串进行反转(因为个位在字符串末尾)
for (int i = 0; i < strA.length(); i++) {
A[strA.length() - 1 - i] = (strA.charAt(i) - 48); // 减48,将ASCII码转换为数字
}
for (int i = 0; i < strB.length(); i++) {
B[B.length - 1 - i] = (strB.charAt(i) - 48); // 减48,将ASCII码转换为数字
}
// 下面就应该进行加法运算了 ,对于结果C的长度,应该是2个加数的最大位数+1。
int maxLen = A.length > B.length ? A.length : B.length;
int[] C = new int[maxLen + 1];
// minLen用来规定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; // r用来保留进位
C[i] = temp % 10; // C中只保留一位数字
}
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++) { // 从A.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);
}
for (int i = 0; i < C.length; i++) {
System.out.print(C[C.length - 1 - i]);
}
}
}
算法思路
- 首先需要充分读懂题目的意思,以及题目给的提示。
- 需要接收2串数字,因为不确定输入数字串的长度,所以,这个我考虑用String对象来接收,然后再放入int数组中。
- 根据输入2串数字中的位数,可以计算出和的长度为在此基础上+1。如:1个5位数和1个6位数相加,和顶多是7位数。
- 不管加数a或者加数b各有几位,我先把他们的最小位数求出来,然后让2个数进行加法运算,在加法运算之前应该先定义一个变量r存放进位,然后让变量temp来做A[i] + B[i] + r的操作,再让r = temp /10; C[i]=temp % 10;即C[i]中只保存一位数字,进位数字放入r中。
- 在执行完第四步操作之后,判断a或b是否有还未被处理的数字,如果有,则执行和第四步类似的操作。
- 最后对C数组进行一点处理,如果C的最高位没有进位(如:99+99,那么C的长度是3,然后C的最高位是1,存的数是198。但是如果是33+33,那么C的长度也是3,然后C的最高位是0),即为0,就需要把这个0给去掉,然后再输出,否则,直接输出。(因为C[0]存放的是个位数字,所以最高位数字存放在C[C.length-1]中)。
注:本程序原理不是很难,所以加的注释不算多,本人一向相信一个观念——不加注释的程序,不是一个好的程序。如果大伙有好的想法,可以留言和我一起交流。