用C语言编写水仙花数时遇到了问题,希望得到高手的指点。407输不出来!!

#include<stdio.h>#include<stdlib.h>#include<math.h>intmain(){inti,a,b,c;printf("水仙花数:... #include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
int i,a,b,c;
printf("水仙花数:\n");
for(i=100;i<=999;i++)
{
a=i/100;
b=(i-((i/100)*100))/10;
c=i-((i/10)*10);
if((pow(a,3)+pow(b,3)+pow(c,3))-i==0)
{
printf("%d\n",i);
}
}
return 0;
}

结果:没有407

水仙花数:153 370 371
Process returned 0 (0x0) execution time : 0.043 s
Press any key to continue.

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

int main()
{
int i,a,b,c;
printf("水仙花数:\n");
for(i=100;i<=999;i++)
{
a=i/100;
b=(i-((i/100)*100))/10;
c=i-((i/10)*10);
if(fabs((pow(a,3)+pow(b,3)+pow(c,3))-i)<=1.0e-6)
{
printf("%d\n",i);
}
}
return 0;
}

结果:有407

水仙花数:153 370 371 407

Process returned 0 (0x0) execution time : 0.153 s
Press any key to continue.

小弟不懂为什么直接判断是不是与 i 相等会导致无法输出407。谢谢指点!!!
展开
 我来答
guodongdb
2012-06-09 · TA获得超过155个赞
知道答主
回答量:211
采纳率:0%
帮助的人:173万
展开全部
个人觉得这是一个rounding error的问题。简单的说吧,我们在写代码的时候,可以选择整数输入,但是计算机只能进行2进制计算。如0.1,在10进制里,这个很好表达。但是在2进制里,他的结果是:0.00011001100110011…是一个无穷数,所及计算的结果是会有误差的。
两个程序的关键差别在于if的数字的判断,也就是IF语句
if(fabs((pow(a,3)+pow(b,3)+pow(c,3))-i)<=1.0e-6),这句话恰恰是通过我们人为的设置,来回避rounding error。也就是说,我们不需要两个数完全相等,只要他们的差值地绝对值(fabs)小于一个很小的数(在这里他设定的是1.0e-6),就认为他们是相等的。
追问
谢谢你的回答,不过我更想知道的是为什么在第一个代码里153   370   371   可以输出,而 407 不能输出?
追答
就像我之前说的,计算机在计算的时候使用的是二进制。pow()函数本身的返回值是double,所以你在使用的时候,计算机实际算出来的结果和我们的希望是有误差的,就是rounding error。
我把你的代码做了点修改,把i=407特别的踢了出来,你可以试一下,看看输出的结果:
#include
#include
#include
#include
using namespace std;

int main()
{
int i,a,b,c;
double d;

printf("水仙花数:\n");
for(i=100;i<=999;i++)
{
a=i/100;
b=(i-((i/100)*100))/10;
c=i-((i/10)*10);
d=(pow(a,3)+pow(b,3)+pow(c,3))-i;

if(d == 0)
{
printf("%d\n",i);
}
if(d != 0 && i == 407)
{
cout<<d<<endl;
}
}
system("pause");
return 0;
}
在我的编译器上看,当i=407时,编译器用pow()的计算结果和407本身是不相等的,误差非常小,但是任然存在。所以如果直接比较2个数,结果就是不相等,不输出。这就是为什么,第二段代码,当使用近似相等时,就可以输出407
huqiuser123
2012-06-09 · TA获得超过119个赞
知道小有建树答主
回答量:201
采纳率:0%
帮助的人:189万
展开全部
也许的机子的原因吧,我的机子运行第一个程序结果有407.
好多书上说比较浮点数不能直接等于,要向你第二个程序写的那样写。
其实这道题可以不让它转化成浮点数。

#include <stdio.h>

int main()
{
int i,a,b,c;
printf("水仙花数:\n");
for(i=100;i<=999;i++)
{
a=i/100;
b=(i%100)/10;
c=i%10;
if(a*a*a+b*b*b+c*c*c==i)
{
printf("%d\n",i);
}
}
return 0;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式