蓝桥杯VIP试题 之 基础练习 高精度加法 - JAVA
问题描述
输入两个整数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]); } }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
文章来源: czhenya.blog.csdn.net,作者:陈言必行,版权归原作者所有,如需转载,请联系作者。
原文链接:czhenya.blog.csdn.net/article/details/104548254
- 点赞
- 收藏
- 关注作者
评论(0)