POJ 2109

来源:互联网 发布:常见协议端口号 编辑:程序博客网 时间:2024/05/20 09:24

题意:
给你两个数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;}*/
原创粉丝点击