题目链接http://poj.org/problem?id=2109
首先发现自己的一个知识漏洞。。就是对各种类型的具体范围不明确。。
类型 长度 (bit) 有效数字 绝对值范围
float 32 6~7 10^(-37) ~ 10^38
double 64 15~16 10^(-307) ~10^308
long double 128 18~19 10^(-4931) ~ 10 ^ 4932
接着我们就可以用二分来做这道题了。。。刚好复习下上学期开始学习的二分···好久没用
但是如果都可以用double的话那就可以直接用pow直接水过去了。。。用pow(p,1/n)
还有个问题要明确的就是对于double 来说scanf("%lf") printf("%f")两个不完全一样。。一开始写成lf直接WA。。
#include<stdio.h>
#include<math.h>
int main ()
{
double n,p;
while (scanf("%lf%lf",&n,&p)==2)
printf("%.0f\n",pow(p,1/n));
return 0;
}
这里附上二分代码
#include<stdio.h>
#define eps 0.00000001
#include<math.h>
int main ()
{
double n,p;
while (scanf("%lf%lf",&n,&p)==2)
{
double left=0,right=1e10;
double mid;
while (right-left>eps)
{
mid=(right+left)/2;
if(pow(mid,n)>p)
right=mid;
else if(pow(mid,n)<p)
left=mid;
}
printf("%.0f\n",mid);
}
return 0;
}
然而题目中又说一定存在一个这样的整数那么二分其实可以再改一下····
#include<stdio.h>
#include<math.h>
#define eps 0.00000001
int main ()
{
double n,p;
while (scanf("%lf%lf",&n,&p)==2)
{
long long left=0,right=1e9;
long long mid;
while (right-left>eps)
{
mid=(right+left)/2;
if(pow(mid,n)>p)
right=mid;
else if(pow(mid,n)<p)
left=mid;
else
{
printf("%ld\n",mid);
break;
}
}
}
return 0;
}