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 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 }  

 

posted @ 2015-01-13 18:36  J·A  阅读(212)  评论(0编辑  收藏  举报