题目链接: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