水仙花数问题中,遇到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;
就没有问题 pow() 函数用来求 x 的 y 次幂(次方),x、y及函数值都是double型 ,其原型为:
double pow(double x, double y);
你是不是转化下类型呀
sum = sum + (int)pow(k, 3); 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 22:56
确实,改成(float)pow(5,3)==125,不过又遇到个问题:
# include
# include
想知道pow(5,3)== 124仅仅出现在水仙花数问题中吗?在测试程序中又是pow(5,3) == 125,不知道为啥 学C的凯 发表于 2020-2-24 23:00
想知道pow(5,3)== 124仅仅出现在水仙花数问题中吗?在测试程序中又是pow(5,3) == 125,不知道为啥
我个人的观点,精度的问题 我按你的代码调试没问题啊 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 调试前的关键行代码为: 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;
}
我也认为应该是精度问题,但是不知道为啥:在相同情况下,pow函数的这个精度问题在水仙花数程序中出现,在测试程序中却又不出现
页:
[1]