题意:
给你两个数n和p,其中1<=n<=200,1<=p<-10^101,让你求k,满足k^n = p,k的范围是1<=k<=10^9
分析:
这个题难就难在大整数的处理上面,pow(m,n)求的是m的n次方,可以用m的1/n次方来求k
二分查找阿,对阿,恍然大悟阿,二分法就过了这道题
但是二分的时候出现了一些问题,再定义n和p时,我一开始是使用long long结果在计算大数的时候出不了结果,把这两个都改成double的话,就出现了结果.原因就出在pow的参数上面.据说这是一个贪心题,但是没有想到好的实现思路,暂时先放着.
具体参数如下:
double pow (double base , double exponent);
float pow (float base , float exponent);
long double pow (long double base, long double exponent);
double pow (Type1 base , Type2 exponent); // additional overloads
代码:
//verion:先二分一下
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
double n;
double p;
long long right,mid,left;
while(cin>>n>>p)
{
left=0;
right=1000000002;
double r=0.00000001;
while(right-left>r)
{
mid=(left+right)/2.0;
if(pow(mid,n)-p>0)
{
right=mid;
}
else if(pow(mid,n)-p<0)
{
left=mid;
}
else
{
cout<<mid<<endl;
break;
}
}
}
return 0;
}
/*
//version2:直接pow来求解,这是个bug阿
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
double n,p;
while(cin>>n>>p)
{
cout<<pow(p,1.0/n)<<endl;
}
return 0;
}
*/