街角提子 发表于 2020-9-9 13:00:51

关于c语言课后作业《数据类型》

本帖最后由 街角提子 于 2020-9-9 13:04 编辑

在课后作业中有数麦数的问题,根据提示我照猫画虎进行编程,但编程后的结果是unsigned int的最大值而不是如答案中所说的unsigned long long int的最大值,


我个人的代码如下:

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

int main()
{
       
        int i;
        unsigned long longsum;
        unsigned long longweight;
        unsigned long longm;
       
        for(i=0;i<64;i++)
        {
                m=pow(2,i);
                sum=sum+m;
        }
       
        weight=sum/25000;
       
        printf("舍罕王应该给达伊尔%11u的麦子,\n\
如果每25000粒麦子为1kg,那么应该给达伊尔%11u",sum,weight);

return 0;
}

请问有人知道为什么吗

sunrise085 发表于 2020-9-9 13:48:29

你的sum没有赋初值,再者printf中格式化字符写错了,是%llu,你把小写L写成数字1了,所以结果不对。
另外最好不要用pow,这个函数返回值为浮点数,可能会因为精度问题导致结果不太精确。
#include <stdio.h>

int main()
{
      
    int i;
    unsigned long longsum=0;
    unsigned long longweight;
    unsigned long longm=1;
   
    for(i=0;i<64;i++)
    {
      sum=sum+m;
      m=m*2;
    }
   
    weight=sum/25000;
   
    printf("舍罕王应该给达伊尔%llu的麦子,\n\
如果每25000粒麦子为1kg,那么应该给达伊尔%llukg",sum,weight);

    return 0;
}

风过无痕1989 发表于 2020-9-9 13:50:40

可能是 pow() 函数在转换时出的问题,pow() 输出的是双精度 double 型数据,运算中被自动转换成了 unsigned long long 型了,数据可能造成了丢失。

以上只是猜测,我的系统不支持 long long 型,你自己试试看
页: [1]
查看完整版本: 关于c语言课后作业《数据类型》