二分法+高精度――Poj 2109 Power of Cryptography(double型开n次方的方法通过的原因)(二)

2014-11-24 08:55:50 · 作者: · 浏览: 1
, n, res), p) == GREATER)
{
mid--;
}
printf("%d\n", mid);
}
return 0;
}

double型开n次方的方法通过的原因
下面这段程序也是可以通过此题的。
#include
#include

int main(void)
{
double n, p;
while(scanf("%lf%lf", &n, &p) != EOF)
{
printf("%.0lf\n", pow(p, 1/n));
}
return 0;
}

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