鱼C论坛

 找回密码
 立即注册
查看: 1399|回复: 8

[已解决]水仙花数问题中,遇到pow(5,3)==124??

[复制链接]
发表于 2020-2-24 22:23:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
/*
Description
输出所有的水仙花数。所谓水仙花数是一个3位的正整数,其各位数字的立方和等于这个数本身。
例如,153是水仙花数,因为1^3+5^3+3^3=153。 ^代表上标

输入格式


输出格式
一行一个,由小到大输出所有水仙花数
*/

# include <Stdio.h>
# include <math.h>

int main()
{
    int i, j, k, l;
    int sum = 0;


    for (i = 100; i <= 999; i++,sum = 0)
    {
        for (j = i; j != 0; j /= 10)
        {
            k = j % 10;
            sum = sum + pow(k, 3);
        /*查看代码执行过程,发现一到含有5的数字就出问题,5^3==124?,可以查看执行结果为水仙花数i = 153的那行的结果*/
            printf(" i = %d,j = %d, k = %d, sum = %d\n",i, j, k, sum);//
            if (sum > i)
            {
                break;
            }
        }

        if (i == sum)
        {
            printf("%d\n", i);
        }

    }
    return 0;
}

为什么内层循环的那几行代码换成:
            k = j % 10;
            l = k * k * k;
            sum = sum + k*k*k;
就没有问题
最佳答案
2020-2-24 22:31:32
pow() 函数用来求 x 的 y 次幂(次方),x、y及函数值都是double型 ,其原型为:
    double pow(double x, double y);
你是不是转化下类型呀
sum = sum + (int)pow(k, 3);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-24 22:31:32 | 显示全部楼层    本楼为最佳答案   
pow() 函数用来求 x 的 y 次幂(次方),x、y及函数值都是double型 ,其原型为:
    double pow(double x, double y);
你是不是转化下类型呀
sum = sum + (int)pow(k, 3);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-24 22:56:57 | 显示全部楼层
4goodworld 发表于 2020-2-24 22:31
pow() 函数用来求 x 的 y 次幂(次方),x、y及函数值都是double型 ,其原型为:
    double pow(double x ...

确实,改成(float)pow(5,3)==125,不过又遇到个问题:
# include <stdio.h>
# include <math.h>

int main()
{
    int i;
    i = pow(5,3);

    printf("%d", i);

    return 0;
}
这样的结果又是125
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-24 23:00:14 | 显示全部楼层
学C的凯 发表于 2020-2-24 22:56
确实,改成(float)pow(5,3)==125,不过又遇到个问题:
# include
# include

想知道pow(5,3)== 124仅仅出现在水仙花数问题中吗?在测试程序中又是pow(5,3) == 125,不知道为啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-24 23:16:39 | 显示全部楼层
学C的凯 发表于 2020-2-24 23:00
想知道pow(5,3)== 124仅仅出现在水仙花数问题中吗?在测试程序中又是pow(5,3) == 125,不知道为啥

我个人的观点,精度的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-24 23:24:18 | 显示全部楼层
我按你的代码调试没问题啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-24 23:31:12 | 显示全部楼层
i=153  ,j=153,k=3,sum=27                      sum=3^3
i=153  ,j=15,k=5,sum=152                      sum=27+5^3
i=153  ,j=1,k=1,sum=153                       sum=152+1^3

没问题呀,5^3  = 152-27=125
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-24 23:43:21 | 显示全部楼层
调试前的关键行代码为: sum = sum + pow(k, 3);
部分执行过程结果如下:

i = 150,j = 150, k = 0, sum = 0
i = 150,j = 15, k = 5, sum = 124-------->有问题
i = 150,j = 1, k = 1, sum = 125
i = 151,j = 151, k = 1, sum = 1
i = 151,j = 15, k = 5, sum = 125
i = 151,j = 1, k = 1, sum = 126
i = 152,j = 152, k = 2, sum = 8
i = 152,j = 15, k = 5, sum = 132------->应该是133,有问题
i = 152,j = 1, k = 1, sum = 133
i = 153,j = 153, k = 3, sum = 27
i = 153,j = 15, k = 5, sum = 151----------->应该为152,有问题
i = 153,j = 1, k = 1, sum = 152
i = 154,j = 154, k = 4, sum = 64
i = 154,j = 15, k = 5, sum = 188
i = 155,j = 155, k = 5, sum = 124
i = 155,j = 15, k = 5, sum = 248
i = 156,j = 156, k = 6, sum = 216
i = 157,j = 157, k = 7, sum = 343
i = 158,j = 158, k = 8, sum = 512
i = 159,j = 159, k = 9, sum = 729

可能是编译器不同导致我们执行结果不同,但是在我的编译器中单独的pow函数测试程序中结果却又是:pow(5,3)== 125:
# include <stdio.h>
# include <math.h>

int main()
{
    int i;
    i = pow(5,3);

    printf("%d", i);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-24 23:47:07 | 显示全部楼层
我也认为应该是精度问题,但是不知道为啥:在相同情况下,pow函数的这个精度问题在水仙花数程序中出现,在测试程序中却又不出现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 02:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表