殷九 发表于 2020-8-2 02:24:05

为什么结果显示为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千粒,总重量为%lluKG\n",weight);
       
        return 0;
}

Twilight6 发表于 2020-8-2 06:53:01


for(i=0;i<64;i++); 这里多了个分号导致的,去掉这个分号即可:

#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千粒,总重量为%lluKG\n", weight);

    return 0;
}

风过无痕1989 发表于 2020-8-3 00:26:24

Twilight6 发表于 2020-8-2 06:53
for(i=0;i

请教,你们回帖都有行号,下面还有“复制代码”,如何做到的?

Twilight6 发表于 2020-8-3 00:27:50

风过无痕1989 发表于 2020-8-3 00:26
请教,你们回帖都有行号,下面还有“复制代码”,如何做到的?


编辑器有 <> 这个按钮,按这个即可

如何正确地发代码、上传图片和附件?
https://fishc.com.cn/thread-52272-1-1.html
(出处: 鱼C论坛)

风过无痕1989 发表于 2020-8-3 00:32:54

Twilight6 发表于 2020-8-3 00:27
编辑器有这个按钮,按这个即可

如何正确地发代码、上传图片和附件?


明白了,我在软件里怎么都找不到<>,原来是在回帖子的时候,谢谢!

徐德民 发表于 2020-8-3 18:39:38

#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千粒,总重量为%lluKG\n", weight);

    return 0;
}

405794672 发表于 2020-8-4 15:05:01

for后面分号,表示结束。大括号里面自成一体。里面所有变量都是新的。与你上面定义的无关。所以后面的sum还是你定义的0,因为出了大括号,这个sum又是你定义的那个sum了。

baige 发表于 2020-8-4 15:19:22

本帖最后由 baige 于 2020-8-4 15:55 编辑

405794672 发表于 2020-8-4 15:05
for后面分号,表示结束。大括号里面自成一体。里面所有变量都是新的。与你上面定义的无关。所以后面的sum还 ...
.

baige 发表于 2020-8-4 15:25:56

本帖最后由 baige 于 2020-8-4 16:12 编辑

sum = 2^65-1 = 3.6893488147419e+19
weight = (2^65-1)/25000 = 1.4757395258968e+15
这个时候C/C++的数据类型已经不能存储这么大的数了

baige 发表于 2020-8-4 15:29:48

本帖最后由 baige 于 2020-8-4 15:31 编辑

unsigend long long 取值范围 , 如果ull类型的整数溢出了,就相当于取模2^64了, 题目中sum = temp = pow(2,64) = 2^64 = 0;

405794672 发表于 2020-8-4 15:34:58

baige 发表于 2020-8-4 15:19
溢出而已,都20位数字了

你可以运行一下,这个程序会告诉你sum不等于0

颠覆了我的认知啊!感谢感谢。我试了一下下面这个代码,才知道是什么情况。编译器挺智能的啊。
#include<stdio.h>
#include<math.h>

    int main() {
      int sum = 0;


      {
            int sum = 1;
            printf("%d\n", sum);
      }
      printf("%d\n", sum);
      return 0;
    }

baige 发表于 2020-8-4 16:08:45

对于pow(2,65)-1刚查了一下对于C/C++的数据类型已经不能存储了
这个时候还是python好
sum = 0
for i in range(0,65):
    sum += pow(2,i)
weight = sum / 25000
print('汗舍王应该给'+ str(sum) +'粒麦子')
print('如果一公斤为25000千粒,总重量为'+str(weight)+'KG')
页: [1]
查看完整版本: 为什么结果显示为0