喝水大王 发表于 2018-7-5 15:10:46

关于带你学C带你飞s1e6课后作业的问题

本帖最后由 喝水大王 于 2018-7-5 15:14 编辑

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

int main()
{
      unsigned long long sum=0;
      int i;

      for (i=0;i<64;i++)
      {
                sum=sum+pow(2,i);
                printf("%llu    %d\n",sum,i);   
      }

      printf("一共需要%llu kg\n",(sum/25000));

      return 0;
}
每次循环都打印出sum的值以此验证,当i=63的时候,sum的值为0,请问是为什么?

================================================
以下是答案给出的代码
#include <stdio.h>
#include <math.h>

int main()
{
      unsigned long long sum = 0;
      unsigned long long temp;
      unsigned long long weight;
      int i;

      for (i=0; i < 64; i++)
      {
                temp = pow(2, i);
                sum = sum + temp;
      }

      weight = sum / 25000;

      printf("舍罕王应该给予达依尔%llu粒麦子!\n", sum);
      printf("如果每25000粒麦子为1kg,那么应该给%llu公斤麦子!\n", weight);

      return 0;
}

BngThea 发表于 2018-7-5 15:12:32

溢出?

喝水大王 发表于 2018-7-5 15:15:14

BngThea 发表于 2018-7-5 15:12
溢出?

答案的结果就不会溢出{:10_266:}

BngThea 发表于 2018-7-5 16:14:24

喝水大王 发表于 2018-7-5 15:15
答案的结果就不会溢出

你可以先将/25000放到循环里面试试

DadingVIP 发表于 2018-7-5 18:50:45

pow函数的返回值是double型,楼主的程序中sum=sum+pow(2,i);是unsigned long long和double两个不同数据类型之间相加;
答案中是先定义了unsigned long long型的temp变量,是将pow函数的返回值赋值给为unsigned long long类型的变量,相当于强制转换,最终是两个unsigned long long数据类型相加,所以后者输出的是正确答案

DadingVIP 发表于 2018-7-5 18:53:41

楼主可以将自己程序中的“sum=sum+pow(2,i);”改为“sum = sum +(unsigned long long)pow(2,i) ;”

喝水大王 发表于 2018-7-5 21:05:26

DadingVIP 发表于 2018-7-5 18:50
pow函数的返回值是double型,楼主的程序中sum=sum+pow(2,i);是unsigned long long和double两个不同数据类型 ...

感谢解答{:10_254:}
页: [1]
查看完整版本: 关于带你学C带你飞s1e6课后作业的问题