蓝桥杯-高精度加法-JAVA

题目


Description

输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。

Input

输入描述:
  由于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输出即可。
输入样例:
20100122201001221234567890
2010012220100122

Output

输出描述:
  输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
输出样例:
20100122203011233454668012

思路:
  1、以String类型接收输入的两个数;
  2、然后分别将两个字符串切割,存入两个数组a[ ],b[ ] 中,因为6位数和7位数相加,和顶多是8位数(顶多比最高位多一位),因此数组长度都设为 max+1 (max是输入的两个数中最长的那个数的长度);
  3、a[0] 存储个位,a[1]存储十位…位数存完的,其他位都存0,比如1362 和 12 ,
 a[0] = “2”、a[1] = “6”、a[2] = “3”、a[3] = “1”、a[4] = “0”;
 b[0] = “2”、b[1] = “1”、b[2] = “0”、b[3] = “0”、b[4] = “0”
  4、最后求完和,要记得判断最高位是否为0,为0的话则不输出最高位,比如上面的例子,相加后,结果为:01374

import java.util.Scanner;

public class HighPrecisionAddition {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s1 = sc.next();		//输入的第一个值
		String s2 = sc.next();		//输入的第二个值
		
		int l1 = s1.length();
		int l2 = s2.length();
		int max = l1 > l2 ? l1 : l2;	//求出最长字符串的长度大小
		int r = 0;						//存放进位
		
		//6位数和7位数相加,和顶多是8位数,故数组长度设为max+1
		String[] a = new String[max+1];
		String[] b = new String[max+1];
		String[] c = new String[max+1];
		/*
			substring(a,b)截取字符串
			举例:
			"hamburger".substring(4, 8) returns "urge"
			"smiles".substring(1, 5) returns "mile"
			注意字符串索引从0开始
		*/
		for(int i = 0; i < max+1; i++) {	
			if( i < l1 ) {
				a[i] = s1.substring(l1-1-i, l1-i);
			}else {
				a[i] = "0";
			}
		}
		
		for(int i = 0; i < max+1; i++) {
			if( i < l2 ) {
				b[i] = s2.substring(l2-1-i, l2-i);
			}else {
				b[i] = "0";
			}
		}
		/*
			Integer.parseInt(String s): 返回 用十进制参数表示的整数值类型(即转为int类型)
			String.valueOf(int i): 返回 int 参数的字符串表示形式(即转为String类型)
		*/
		for(int i = 0; i < max+1; i++) {
			c[i] = String.valueOf((Integer.parseInt(a[i]) + Integer.parseInt(b[i]) + r) % 10) ;
			r = (Integer.parseInt(a[i]) + Integer.parseInt(b[i]) + r) / 10;
		}
		
		//首位去0:首位不为0,则输出
		if( !"0".equals(c[max]) ) {
			System.out.print(c[max]);
		}
		
		for(int i = max-1; i >= 0; i--) {
			
			System.out.print(c[i]);
		}
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值