鱼C论坛

 找回密码
 立即注册
查看: 789|回复: 12

[已解决]为什么结果显示为0

[复制链接]
发表于 2020-8-2 02:24:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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;
}
最佳答案
2020-8-2 06:53:01

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

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

  3. int main() {
  4.     unsigned long long sum = 0;
  5.     unsigned long long temp;
  6.     unsigned long long weight;
  7.     int i;

  8.     for (i = 0; i < 64; i++)
  9.     {
  10.         temp = pow(2, i);
  11.         sum = sum + temp;
  12.     }

  13.     weight = sum / 25000;

  14.     printf("汗舍王应该给%llu粒麦子\n", sum);
  15.     printf("如果一公斤为25000千粒,总重量为%lluKG\n", weight);

  16.     return 0;
  17. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-2 06:53:01 | 显示全部楼层    本楼为最佳答案   

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

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

  3. int main() {
  4.     unsigned long long sum = 0;
  5.     unsigned long long temp;
  6.     unsigned long long weight;
  7.     int i;

  8.     for (i = 0; i < 64; i++)
  9.     {
  10.         temp = pow(2, i);
  11.         sum = sum + temp;
  12.     }

  13.     weight = sum / 25000;

  14.     printf("汗舍王应该给%llu粒麦子\n", sum);
  15.     printf("如果一公斤为25000千粒,总重量为%lluKG\n", weight);

  16.     return 0;
  17. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-3 00:26:24 | 显示全部楼层

请教,你们回帖都有行号,下面还有“复制代码”,如何做到的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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



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

如何正确地发代码、上传图片和附件?
https://fishc.com.cn/thread-52272-1-1.html
(出处: 鱼C论坛)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-3 00:32:54 | 显示全部楼层
Twilight6 发表于 2020-8-3 00:27
编辑器有  这个按钮,按这个即可

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

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

点评

客气了~  发表于 2020-8-3 00:33
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-3 18:39:38 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<math.h>

  3. int main() {
  4.     unsigned long long sum = 0;
  5.     unsigned long long temp;
  6.     unsigned long long weight;
  7.     int i;

  8.     for (i = 0; i < 64; i++)
  9.     {
  10.         temp = pow(2, i);
  11.         sum = sum + temp;
  12.     }

  13.     weight = sum / 25000;

  14.     printf("汗舍王应该给%llu粒麦子\n", sum);
  15.     printf("如果一公斤为25000千粒,总重量为%lluKG\n", weight);

  16.     return 0;
  17. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 15:05:01 | 显示全部楼层
for后面分号,表示结束。大括号里面自成一体。里面所有变量都是新的。与你上面定义的无关。所以后面的sum还是你定义的0,因为出了大括号,这个sum又是你定义的那个sum了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 15:19:22 | 显示全部楼层
本帖最后由 baige 于 2020-8-4 15:55 编辑
405794672 发表于 2020-8-4 15:05
for后面分号,表示结束。大括号里面自成一体。里面所有变量都是新的。与你上面定义的无关。所以后面的sum还 ...

.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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++的数据类型已经不能存储这么大的数了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 15:29:48 | 显示全部楼层
本帖最后由 baige 于 2020-8-4 15:31 编辑

unsigend long long 取值范围 [0,2^64-1], 如果ull类型的整数溢出了,就相当于取模2^64了, 题目中sum = temp = pow(2,64) = 2^64 = 0;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 15:34:58 | 显示全部楼层
baige 发表于 2020-8-4 15:19
溢出而已,都20位数字了

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

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

  3.     int main() {
  4.         int sum = 0;


  5.         {  
  6.             int sum = 1;
  7.             printf("%d\n", sum);
  8.         }
  9.         printf("%d\n", sum);
  10.         return 0;
  11.     }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 16:08:45 | 显示全部楼层
对于pow(2,65)-1刚查了一下对于C/C++的数据类型已经不能存储了
这个时候还是python好
  1. sum = 0
  2. for i in range(0,65):
  3.     sum += pow(2,i)
  4. weight = sum / 25000
  5. print('汗舍王应该给'+ str(sum) +'粒麦子')
  6. print('如果一公斤为25000千粒,总重量为'+str(weight)+'KG')
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 02:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表