POJ 2159 二分/精度考察

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">刚开始想着直接用换底公式:log</span><span style="font-family: Arial, Helvetica, sans-serif; font-size: 10px; background-color: rgb(255, 255, 255);">a</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">b=(lg b)/(lg a) <span style="font-family:宋体;">做,后来看到数据范围是</span>1<=n<= 200, 1<=p<10^101的时候感觉可能是要用大数了。想了一下有没有可以优化的方法,没有思路,就查了解题报告....(T_T,手贱,总是改不了这个毛病),发现double类型可以存的下10^101次方,整个代码不过几行....好吧还是基础太渣。</span>

类型          长度 (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


省赛的时候也曾经因为精度问题起过分歧,吸取经验教训,以后不再犯这样的错误了。

超简洁的代码:

#include<stdio.h>
int main()
{
    double p, n;
    while(scanf("%lf%lf",&n,&p)!=EOF)
        printf("%.0lf\n",pow(p,1/n));
    return 0;
}


然后,还有一种方法就是二分法,从中间值开始猜数k,直到k^n==p,退出;

#include<stdio.h>
#include <math.h>

int main()
{
    double p, n;
    while(scanf("%lf%lf",&n,&p)!=EOF)
    {
        long long r, l, m;
        double t;
        l=0;r=1000000002;
        while(l<=r)
        {
            m=(l+r)/2;
            t=pow(m, n);
            if(t==p)
            {
                printf("%lld\n",m);
                break;
            }
            else
            {
                if(t>p) r=m;
                else    l=m+1;
            }
        }
    }
    return 0;
}

T_T以后再随便搜解题报告就剁手

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值