为什么用pow函数计算结果有误?少了一个水仙花数,费解

R2Freedom 2015-03-18 10:25:34
#include  <stdio.h>
#include <math.h>

int main()
{
int n;
int i=0;

for(n=100;n<1000;n++)
{
if(n==pow(n/100,3)+pow(n%100/10,3)+pow(n%10,3))
{
printf("%d\n",n);
i++;
}
}
printf("%d\n",i);
return 0;
}


运行如下:


为什么少了一个水仙花数?
是因为数据类型的问题?有大神能详解么?
...全文
364 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
idzeta 2015-03-19
  • 打赏
  • 举报
回复
运行时库的pow()的精度有问题?基本上该换掉了…… 不换的话,本题中可将所有pow()的返回值或者它们的总和手动四舍五入到整数后再与n比较。
纵横车 2015-03-19
  • 打赏
  • 举报
回复
pow()函数的第一个参数好像不能是int型的,你把它强制转换成double型再把返回值强制转换成int型试试。
赵4老师 2015-03-19
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
if(n==pow(n/100,3)+pow(n%100/10,3)+pow(n%10,3)) 改为 if(1E-6<fabs(n-(pow(n/100,3)+pow(n%100/10,3)+pow(n%10,3)))
纠正楼上 if(1E-6>fabs(n-(pow(n/100,3)+pow(n%100/10,3)+pow(n%10,3)))
赵4老师 2015-03-19
  • 打赏
  • 举报
回复
if(n==pow(n/100,3)+pow(n%100/10,3)+pow(n%10,3)) 改为 if(1E-6<fabs(n-(pow(n/100,3)+pow(n%100/10,3)+pow(n%10,3)))
赵4老师 2015-03-19
  • 打赏
  • 举报
回复
double pow( double x, double y ); http://bbs.csdn.net/topics/390676437
Groves_Lin 2015-03-19
  • 打赏
  • 举报
回复
he pow(int, int) overload is no longer available. If you use this overload, the compiler may emit C2668. To avoid this problem, cast the first parameter to double, float, or long double.
mymtom 2015-03-19
  • 打赏
  • 举报
回复
这个算法还是不要用浮点运算吧

int
main(int argc, char *argv[])
{
    int i, n;
    int d1, d2, d3;

    i = 0;
    for (n = 100; n < 1000; n++) {
        d1 = n % 10;
        d2 = n % 100 / 10;
        d3 = n / 100;
        if (n == d1*d1*d1 + d2*d2*d2 + d3*d3*d3) {
            i++;
            printf("%d\n", n);
        }
    }
    printf("%d\n", i);

    return 0;
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧