问题描述
输入两个整数
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的所有位。
定义一个数组 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输出即可。
package com.xjj.lanqiao;
import java.util.Scanner;
/*----大数据相加--高精度
*
* */
public class Lq2_29 {
//大数据类--结构体
class bign{
int[] num = new int[200];
int len = 0;
}
bign a = new bign();
bign b = new bign();
//高精度相加
public void add(bign a, bign b){
bign c = new bign(); //暂存
int carry = 0; //进位
//遍历每位数组,找最长数组
for(int i = 0; i < a.len || i < b.len; i++){
//每位数组相加在加上进位
int temp = a.num[i] + b.num[i] + carry;
c.num[c.len++] = temp % 10; //求模得个位
carry = temp / 10; //相除得进位,最多进一位
}
//最多进一位
if (carry != 0)
c.num[c.len++] = carry;
//高位到低位输出
for(int i = c.len - 1; i >= 0; i--){
System.out.print(c.num[i]);
}
}
public static void main(String[] args) {
System.out.println();
Scanner scanner = new Scanner(System.in);
Lq2_29 lq = new Lq2_29();
String str1 = scanner.nextLine();
String str2 = scanner.nextLine();
//将字符转换为数组
char[] csa = str1.toCharArray();
char[] csb = str2.toCharArray();
int lena = csa.length;
int lenb = csb.length;
//将char[] 转换为 int[]
//必须记得是数组高位存数值高位,即 i 必须从 len-1 开始
for(int i = lena - 1; i >= 0; i--){
lq.a.num[lq.a.len++] = csa[i] - '0';
}
for(int i = lenb - 1; i >= 0; i--)
lq.b.num[lq.b.len++] = csb[i] - '0';
lq.add(lq.a, lq.b);
}
}