poj2109 二分法+高精度

该博客主要讨论POJ2109题目,涉及用二分法解决指数问题。由于数据规模较大,double类型会丢失精度,文章指出在特定情况下直接二分法可能不准确,比如n=2, p=27。博主通过举例说明,当数据超出double精度范围时,低位会被截断,导致计算错误。因此,正确解法需要考虑精度问题。" 127364748,15191348,人工神经网络:应用、原理与分类,"['神经网络', '机器学习', '人工智能', '图像处理', '数据挖掘']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意: K ^ N = P, 给N 和 P, 求K。数据规模 :1<=n<= 200, 1<=p<10101 and there exists an integer k, 1<=k<=109

注意此题第一种二分法 不能用于n=2 p=27类似情况

第一种做法 二分法

#include<stdio.h>
#include<math.h>
#define eps 0.0000000001
void init(), work();
double n, m, k;
int main()
{
    init();
    return 0;
}
void init()
{
    while(scanf("%lf %lf", &n, &m) != EOF)
        work();
}
void work()
{
    long long left, right, mid;
    left = 0;
    right = 1000000002;
    while(left + eps < right){
        mid = (left + right) / 2;
        if(pow(mid, n) - m > 0)
            right = mid;
        else
            if(pow(mid, n) - m < 0)
                left = mid;
            else{
                printf("%.0ld\n", mid) ;
                break;
            }
    }
}

第二种直接用double

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

首先,题目中的数据强度并不弱,这一点确实如题目中所说:“For all such pairs 1<=n<= 200, 1<=p<10101,所以,double型是不能精确地表示出所给数据,但是却能表示出一个近似值。

当向double型变量中存入

4357186184021382204544

然后再输出,得到的是

4357186184021382000000

后六位的值变为了0,这一点和int型变量是有很大区别的。也就是说当存入double型变量的值超出了它的精度表示范围时,将低位的数据截断。(关于浮点数在计算机中的表示方法,百度吧…讲的蛮清楚的。)

在本题中,如果测试数据为:

7     4357186184021382204544

实际上所处理数据是:

7     4357186184021382000000

拿4357186184021382000000开7次方的结果自然就是1234。

为什么不是1233或者1235呢?

12337=4332529576639313702577

12347=4357186184021382204544

12357=4381962969567270546875

可以看出在double型所能表示的精度范围内,它们三个值已经不同了。

所以,此题中的测试数据也都是类似于上述情况,所以才能使用double型开n次方的方法。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值