学C的凯 发表于 2020-2-24 22:23:09

水仙花数问题中,遇到pow(5,3)==124??

/*
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;
就没有问题

4goodworld 发表于 2020-2-24 22:31:32

pow() 函数用来求 x 的 y 次幂(次方),x、y及函数值都是double型 ,其原型为:
    double pow(double x, double y);
你是不是转化下类型呀
sum = sum + (int)pow(k, 3);

学C的凯 发表于 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

学C的凯 发表于 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,不知道为啥

4goodworld 发表于 2020-2-24 23:16:39

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

我个人的观点,精度的问题

major_lyu 发表于 2020-2-24 23:24:18

我按你的代码调试没问题啊

小笨笨难得糊涂 发表于 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

学C的凯 发表于 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;
}

学C的凯 发表于 2020-2-24 23:47:07

我也认为应该是精度问题,但是不知道为啥:在相同情况下,pow函数的这个精度问题在水仙花数程序中出现,在测试程序中却又不出现
页: [1]
查看完整版本: 水仙花数问题中,遇到pow(5,3)==124??