首页 > 代码库 > A+B

A+B

前言:

在数学运算的过程中 ,经常碰到这样的问题:参与运算的 数字很大或者对运算结果的精度要求很高。无论何种计算机 语言 ,在描述数据类型时都有一定的精度和位数要求 ,比如说 16 位整型数 (int) 所能表示的范围为 - 32768~32767 ,实数 (float)所能表示的精度为小数点后 8 位等 ,每种类型的数据都 有其精度和位数限制。超过 20 位有效数字的数值一般就无法表示了。所以 ,在上述情况下,采用一般的程序设计无法满 足要求 ,必须采用高精度的数学运算才能实现。如下例

#1000 : A + B

时间限制:1000ms
单点时限:1000ms
内存限制:256MB

描述

求两个整数A+B的和

输入

输入包含多组数据。
每组数据包含两个整数A(1 ≤ A ≤ 100)和B(1 ≤ B ≤ 10000000)。

输出

对于每组数据输出A+B的和。

样例输入
1 23 4
样例输出
37

 

分析:

在加法运算中 ,并没有考虑参与运算的数的位数 , 即使有小数也是一样。每次运算时只是利用加法运算的规则 对参与运算的每一位进行运算 ,每次运算都是在 10 以内进 行 ,并加上了前面的进位。通过这种运算就可以非常准确得到运算结果,并且可以不考虑位数和精度的问题。考虑到计算机的存储问题 ,如果我们采用数组来存储参与运算的每个加数 ,则需要将上面参与运算的数看成字符,并将原来的数翻转。

 

实现算法如下:

1.将 A、 B 按位对齐;

2.低位开始逐位相减;

3.对结果做借位调整。

 1 import java.math.BigDecimal;   2 import java.util.*;   3 public class Main   4 {   5     public static void main(String[] args)   6     {   7         BigDecimal a, b, c;   8         Scanner cin = new Scanner(System.in);   9         while(cin.hasNext())  10         {  11             a = cin.nextBigDecimal();  12             b = cin.nextBigDecimal();  13             c = a.add(b);  14             if(c.compareTo(BigDecimal.ZERO) == 0)  15                 System.out.println("0");  16             else  17                 System.out.println(c.stripTrailingZeros().toPlainString());  18         }  19     }  20 }  

 

A+B