现在的位置: 首页 > 综合 > 正文

poj 2109 Power of Cryptography

2018年04月29日 ⁄ 综合 ⁄ 共 740字 ⁄ 字号 评论关闭

不忍直视啊,网上的大神。

题目一眼看去  貌似是个大数+精度问题,但是大神太多。。。orz

首先,题目中的数据强度并不弱,这一点确实如题目中所说:“For all such pairs 1<=n<= 200, 1<=p<10101,所以,double型是不能精确地表示出所给数据,但是却能表示出一个近似值。
当向double型变量中存入
4357186184021382204544
然后再输出,得到的是
4357186184
021382000000

后六位的值变为了0,这一点和int型变量是有很大区别的。也就是说当存入double型变量的值超出了它的精度表示范围时,将低位的数据截断。(关于浮点数在计算机中的表示方法,百度吧…讲的蛮清楚的。)
在本题中,如果测试数据为:
7     4357186184021382204544
实际上所处理数据是:
7     4357186184021382000000
拿4357186184021382000000开7次方的结果自然就是1234。
为什么不是1233或者1235呢?
12337=4332529576639313702577
12347=4357186184021382204544
12357=4381962969567270546875
可以看出在double型所能表示的精度范围内,它们三个值已经不同了。
所以,此题中的测试数据也都是类似于上述情况,所以才能使用double型开n次方的方法。

于是代码就这么简单

#include<stdio.h>
#include<math.h>
int main()
{
	double a,b,c;
	while(~scanf("%lf %lf",&a,&b))
	{
		c=pow(b,1/a);
		printf("%.0lf\n",c);
	}
	return 0;
}


抱歉!评论已关闭.