POJ 2109

题意:
给你两个数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;
}
*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值