蓝桥杯VIP试题 之 基础练习 高精度加法 - JAVA

举报
陈言必行 发表于 2021/08/14 00:05:57 2021/08/14
【摘要】 问题描述   输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。 算法描述   由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。   定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。   计算c = a + b的时候,首先将A[0]与B[0]相加,...

问题描述
  输入两个整数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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。