高精度加法 蓝桥杯


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

这道题看似简单,实际上,要考虑的问题有很多,比如输入的加数和被加数的值如何分割到数组中,我原来的做法是输入两个整数,然后再利用数学公式把这个数的每一位都分解出来,分割到数组的每一个位置。这样做超级麻烦,主要是我用循环的方法还做不出来……所以最后放弃了这样的做法。
这道题最好用数组和字符串结合来做,相加最后的结果存在一个数组中,输入的数用字符串来表示,因为在字符串中封装了已经写好的函数方法,我们可以直接调用。比如,length()  substring()等。

直接贴代码吧:

import java.util.Scanner;

public class GaoJingdu {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int []k = new int[101];
        String a = cin.nextLine();
        String b = cin.nextLine();
        int []c = new int[100];
        int []d = new int[100];
        for(int i = 0;i<a.length();i++){   //倒存a的值并分割到数组中。
            c[a.length()-1-i] = Integer.parseInt(a.substring(i,i+1));
        }
        for(int i = 0;i<b.length();i++){    //倒存b的值并分割到数组中。
            d[b.length()-1-i] = Integer.parseInt(b.substring(i,i+1));
        }
        for(int i = 0;i<100;i++){   //两数相加
            k[i] = c[i] + d[i];
        }
        for(int i = 0;i<100;i++){   //相加进位
            if(k[i]>=10){
                k[i+1] += k[i]/10;
                k[i] = k[i]/10;
            }
        }
        int f = 0;
        for(int i = 100;i>=0;i--){  //判断数组k的大小,有多少位数就显示多少位结果。
            if(k[i]>0){
                f = i;
                break;
            }
        }
        for(int t = f;t>=0;t--){
            System.out.print(k[t]);
        }
    }
}

有一个大胆的想法,假如不按照题目的要求来做的话,两个高精度的数相加的代码其实很简单,利用math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。

import java.util.Scanner;
import java.math.BigDecimal;
public class GaoJingdu {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        BigDecimal m;
        BigDecimal n;
        BigDecimal l;
        m = cin.nextBigDecimal();
        n = cin.nextBigDecimal();
        l = m.add(n);
        System.out.println(l);
     }
}
虽然这样做也可以,但是就是不知道在蓝桥杯的测试环境下用例能不能通过,因为高精度加法是VIP题,我还不能进去查看和答题,所以也不能确定对不对。不过为了保险起见,我们还是不能偷懒,用字符串和数组来做吧。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值