心鲜旅人 发表于 2020-3-4 14:22:36

s1e6中的最后一个动动手问题。

小甲鱼说最后结果也并非正确答案,因为数值大到unsigned long long也不够用,但当我知道float和double取值范围那么大时,我想如果把数据类型改为float,或许就能做出来了。{:10_257:}
#include <stdio.h>
#include <math.h>

int main()
{
        float sum =0;
        float temp;
        float weight;
        int i;
       
        for (i = 0; i < 64; i++)
        {
                temp = pow(2,i);
                sum = sum + temp;
        }
        weight = sum / 25000;
       
        printf("舍罕王应该给予达依尔%f粒麦子\n",sum);
        printf("如果每25000粒麦子为1kg,那么应该给%f公斤麦子!\n",weight);
       
        return 0;
}
{:10_281:}咦?结果比小甲鱼的大,而且小于float取值的最大值,难道说这就是正确答案?{:10_279:}

zltzlt 发表于 2020-3-4 14:26:52

最可靠的做法应该是用 double :

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

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

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

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

    return 0;
}

x710583435 发表于 2020-8-22 11:10:04

zltzlt 发表于 2020-3-4 14:26
最可靠的做法应该是用 double :

我也是这样写的,但是答案比起小甲鱼给的多一粒,然而仔细一想,2的幂次方从0加到63不就是2的64次方-1嘛,所以小甲鱼的答案应该是对的(虽然他自己说是错了),我特别搞不明白为什么用double写的会比用unsigned long long 要多1粒。请问你了解原因吗?
页: [1]
查看完整版本: s1e6中的最后一个动动手问题。