William_Prince 发表于 2021-8-2 13:39:15

《带你学C带你飞》S1E6舍罕王题目求助

《带你学C带你飞》S1E6舍罕王题目我的代码是这样的
#include <stdio.h>
#include <math.h>

int main()
{
        int i;
        unsigned long long n=0;
        for (i=0;i<64;i++)
        {
                n = n + pow(2,i);
        }
        printf("舍罕王应该给予达依尔%llu粒麦子!\n",n);
        return 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;
}
我寻思着计算谷子数量的那部分应该没有本质区别,但是为什么小甲鱼的是正确的结果,我跑出来的结果永远是0?
而且我看了一下循环内部的情况,写成这样
#include <stdio.h>
#include <math.h>

int main()
{
        int i;
        unsigned long long n=0;
        for (i=0;i<64;i++)
        {
                printf("%llu\n",n);
                n = n + pow(2,i);
        }
        printf("舍罕王应该给予达依尔%llu粒麦子!\n",n);
        return 0;
}
最后是结果是这样

向各位请教了。

wp231957 发表于 2021-8-2 13:39:16

我分析是pow 默认返回值类型为double而double 无法容纳2的64次方
而单独设置一个变量就相当于强转LLU可以容纳2的64次方

han125416866 发表于 2021-8-2 14:32:58

本帖最后由 han125416866 于 2021-8-2 14:36 编辑

可能是数太大溢出了,看看你的编译器   unsigned long long   和double最大是多少吧。

小小的窝 发表于 2021-8-2 15:05:02

上面说的没错,数据溢出,你可以把64改成67,你就会发现后面全是0

William_Prince 发表于 2021-8-3 16:18:37

wp231957 发表于 2021-8-2 13:39
我分析是pow 默认返回值类型为double而double 无法容纳2的64次方
而单独设置一个变量就相当于强转   ...

谢谢!
页: [1]
查看完整版本: 《带你学C带你飞》S1E6舍罕王题目求助