前言:
在数学运算的过程中 ,经常碰到这样的问题:参与运算的 数字很大或者对运算结果的精度要求很高。无论何种计算机 语言 ,在描述数据类型时都有一定的精度和位数要求 ,比如说 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 2 3 4
样例输出
-
3 7
分析:
在加法运算中 ,并没有考虑参与运算的数的位数 , 即使有小数也是一样。每次运算时只是利用加法运算的规则 对参与运算的每一位进行运算 ,每次运算都是在 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 }