题目大意: K ^ N = P, 给N 和 P, 求K。数据规模 :1<=n<= 200, 1<=p<10101
注意此题第一种二分法 不能用于n=2 p=27类似情况
第一种做法 二分法
#include<stdio.h>
#include<math.h>
#define eps 0.0000000001
void init(), work();
double n, m, k;
int main()
{
init();
return 0;
}
void init()
{
while(scanf("%lf %lf", &n, &m) != EOF)
work();
}
void work()
{
long long left, right, mid;
left = 0;
right = 1000000002;
while(left + eps < right){
mid = (left + right) / 2;
if(pow(mid, n) - m > 0)
right = mid;
else
if(pow(mid, n) - m < 0)
left = mid;
else{
printf("%.0ld\n", mid) ;
break;
}
}
}
第二种直接用double
#include<stdio.h>
#include<math.h>
int main()
{
double n, m;
while(scanf("%lf %lf", &n, &m) != EOF)
printf("%.0lf\n" ,pow(m, 1 / n));
}
首先,题目中的数据强度并不弱,这一点确实如题目中所说:“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次方的方法。