栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言编写水仙花数程序及pow()函数可能存在的误差

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言编写水仙花数程序及pow()函数可能存在的误差

先回顾一下题目,如下:

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。 例如:153=1×1×1+5×5×5+3×3×3。

请计算所有N位水仙花数。

输入格式:

在一行内,给出一个正整数N

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

在这里给出一组输入。例如:

3

输出样例:

在这里给出相应的输出。例如:

153
370
371
407

思路:标准做法是利用取余%,求出一个数的个位,是为,百位等,再分别进行N次幂运算求和

现尝试给出代码,下面会进行讨论

#include 
#include 

int main()
{
    int N,sum=0,i,j;
    scanf("%d",&N);
    for (i=pow(10,N-1);i=0;j--)
        {
            sum+=pow((int)(i/pow(10,j))%10,N);  //利用%取余求出各个位再求和,;例如a的千位可以表示为(int)(a/1000)%10
        }
        if (sum==i)
            {
                printf("%dn",sum);
            }
            sum=0;  //不论sum是否等于i,都要在此将sum归0,再重新进入for循环赋值
    }
    return 0;
}

现输入3,在code blocks上运行结果如下:

 发现结果不完全对,少了个153。是代码出错了吗?其实并没有,这串代码在PTA上提交是显示正确的,那为什么会出现这种情况呢?(博主曾困惑许久,后经多方请教才明白其中道理)

我们对下面这串代码进行调试

#include 
#include 

int main()
{
    int i=5,j=3;
    printf("%d   %d",(int)pow(5,3),(int)pow(i,j));
    return 0;
}

输出结果如下:

发现了吗?这两个结果是不一样的只是接近。其原因就在于code blocks(其他平台因环境不同可能结果不同,这里博主使用的是code blocks)对pow()函数的处理存在误差,用常量是没有误差的,但用变量的话就可能出现问题了,涉及到内部数据的存储(当然问题应该还是出现的比较少的) ,只是提出这个现象的存在,就不做深入讨论了。

谨以此文给同博主一样在cb 上使用pow()函数时感到困惑的人一点启发。

*此为博主第一次发帖,若有什么错误敬请指出,对上面陈述的问题若有什么解决建议也欢迎提出。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/457030.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号