poj1001解题报告+测试数据

题目链接:http://poj.org/problem?id=1001&lang=zh-CN&change=true

当初做完A+B后,兴高采烈地做第二题就被虐了。纠结了一个小时后,含恨退出poj了。
现在过了几个月了,在来挑战。

有大数加法的基础做这个还是挺轻松的,基本方向有了。唯一的障碍是小数点。这个怎么处理让当初我的纠结的痛不欲生。其实,这个小数点不用管都可以了,直接忽略就可以。

看看这个例子。

555^2 = 308025
55.5^2 = 3080.25
5.55^2 = 30.8025
0.555^2 = 0.308025

发现了什么规律吧。如果我们不管小数点,这些结果是308025,考虑小数点的话,只是在某个位置上插入小数点罢了。而这个插入的位置恰恰是有规律的。

一位小数*一位小数=两位小数,当然,后面是0的话我们也算进来。
两位*两位 = 四位
三位*三位 = 六位。
…….

小数位数相同的相乘,得到的结果的小数位数等于原来小数位数的2倍。

上面是小数位数相同的情况,考虑一下不相同的情况。

    55.5 * 5.55 = 308.025
    5.55 * 0.555 = 3.08025

看一下就知道了,上面相同的情况是*2,这个就是相加了。
1位*2位 = 3位
2为*3位 = 5位

更一般的,相同的也可以看成是相加。

2位*2位 = 4位
3位*3位 = 6位

试一下其它的小数。

    0.01 * 0.1 = 0.0001
    0.100 * 0.10 = 0.01000

**后面的 0 不要省略

算法实现参考 大数加法 的做法。
至于输出是有点麻烦,慢慢调试总会出来的。

测试数据:来自网络收集的,删除了几组没用的数据增加了几组数据,比如 3.0000 2 结果是9,没有小数点!

老规矩
freopen(“input.txt”,”r”,stdin);
//freopen(“out1.txt”,”w”,stdout);
输出到屏幕上也行
百度网盘:http://pan.baidu.com/s/1dD4eF41
密码:iv2f

你可能感兴趣的:(poj解题报告)