鱼C论坛

 找回密码
 立即注册
查看: 1550|回复: 18

[已解决]有大佬进来帮忙看看吗qwq

[复制链接]
发表于 2020-3-14 16:40:32 | 显示全部楼层 |阅读模式

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

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

x
相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜爱象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着 8 * 8 共 64 格的象棋说:“陛下,请您赏给我一些麦子吧。就在棋盘的第 1 格放 1 粒,第 2 格放 2 粒,第三格放 4 粒,以后每一格都比前一格增加一倍,依此放完棋盘 64 格,我就感激不尽了。”。舍罕王听了达依尔这个“小小”的要求,想都没想就满口答应下来。

结果在给达依尔麦子时舍罕惊奇地发现要给的麦子比自己想象的要多得多,于是他进行了计算,结果令他大惊失色。请问,舍罕王要兑现他的许诺共要多少粒麦子赏赐他的宰相?如果每25000粒麦子重1kg,那么舍罕王应该给予达依尔多少公斤麦子?



这个课后题,我这个数学鬼才一开始曲解了意思,算的是从第三格2*2=4粒开始,第四格放4*4=16粒,第五格放16*16=256粒,第六格放256*256=65536粒,以此类推.....


然后我的代码是这样的:


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


int main()
{
   
        unsigned long long int sum = 3;
        unsigned long long int temp = 2;
        unsigned long long int weight;
        int i = 1;
        
        while(i < 63)
        {
            
                temp = pow(temp, 2);
                sum = sum + temp;
               
                i++;
        }
        
        printf("舍罕王应该给予达依尔%llu粒麦子!\n", sum);
        
        return 0;
         
}



但是得出的结果是:舍罕王应该给予达依尔4295033111粒麦子!
unsigned long long 能够表示最大的数字是 18446744073709551615,按理说我这样应该比正确答案还要多鸭?也应该是18446744073709551615呀,可是为什么反而得出的数那么短呢。。。
最佳答案
2020-3-14 17:09:42
彭格列XI代 发表于 2020-3-14 17:07
啊,我好像知道问题在哪了。。。。temp是不是太大了,没放放在pow(temp,2)里面啊,
不然就 ...
  1. #include <stdio.h>
  2. #include <math.h>


  3. int main(void)
  4. {
  5.      
  6.          unsigned long long int sum = 3;
  7.          unsigned long long int temp = 2;
  8.          unsigned long long int weight;
  9.          int i = 1;
  10.          
  11.          while(i < 63)
  12.          {
  13.             
  14.                  temp = pow(temp, 2);
  15.                  printf("%llu\n", temp);
  16.                  sum += temp;
  17.                  
  18.                  i++;
  19.          }
  20.          
  21.          printf("舍罕王应该给予达依尔%llu粒麦子!\n", sum);
  22.          
  23.          return 0;
  24.          
  25. }
复制代码

抱歉啊,刚才我傻了
你看这段代码最大的结果,它乘上去之后
就太大了,temp装不下,就只能为0
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-14 16:41:53 | 显示全部楼层
本帖最后由 qiuyouzhi 于 2020-3-14 16:44 编辑

pow写反了,应是pow(2, temp)
提示:计算每一格要存放多少麦子,可以使用 pow(2, i) 计算出每一格需要存放的麦子数,然后存放到 temp 变量中。
这是小甲鱼的原话,你不会只看了眼题目吧。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 16:44:15 | 显示全部楼层
乘号变加号。。。不愧是你
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 16:45:01 | 显示全部楼层
墨羽岚 发表于 2020-3-14 16:44
乘号变加号。。。不愧是你

没有的,他写对了,是+
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 16:49:56 | 显示全部楼层
qiuyouzhi 发表于 2020-3-14 16:45
没有的,他写对了,是+

我看错了不愧是我
话说pow函数不是要有个双精度还是浮点来着吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 16:50:24 | 显示全部楼层
墨羽岚 发表于 2020-3-14 16:49
我看错了不愧是我
话说pow函数不是要有个双精度还是浮点来着吗


那倒不用,除非你想保留两位
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 16:51:17 | 显示全部楼层
qiuyouzhi 发表于 2020-3-14 16:50
那倒不用,除非你想保留两位

好的,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 16:53:29 | 显示全部楼层
qiuyouzhi 发表于 2020-3-14 16:41
pow写反了,应是pow(2, temp)
提示:计算每一格要存放多少麦子,可以使用 pow(2, i) 计算出每一格需要存放 ...

pow(x,y)不是表示x 的 y 次幂吗,我从第三格开始,是2的2次方(pow = (2, 2)),得出4,temp被重新覆盖,然后temp=4了,第四格开始就是4的2次方(pow(4, 2)),得16这样...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 17:01:35 | 显示全部楼层
彭格列XI代 发表于 2020-3-14 16:53
pow(x,y)不是表示x 的 y 次幂吗,我从第三格开始,是2的2次方(pow = (2, 2)),得出4,temp被重新 ...

你看看结果吧
  1. #include <stdio.h>
  2. #include <math.h>


  3. int main()
  4. {
  5.      
  6.          unsigned long long int sum = 3;
  7.          unsigned long long int temp = 2;
  8.          unsigned long long int weight;
  9.          int i = 1;
  10.          
  11.          while(i < 63)
  12.          {
  13.             
  14.                  temp = pow(temp, 2);
  15.                  printf("%d\n", temp);
  16.                  printf("%d\n", sum);
  17.                  sum = sum + temp;
  18.                  
  19.                  i++;
  20.          }
  21.          
  22.          printf("舍罕王应该给予达依尔%llu粒麦子!\n", sum);
  23.          
  24.          return 0;
  25.          
  26. }
复制代码

我现在也有亿点点蒙。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 17:01:49 | 显示全部楼层
qiuyouzhi 发表于 2020-3-14 16:41
pow写反了,应是pow(2, temp)
提示:计算每一格要存放多少麦子,可以使用 pow(2, i) 计算出每一格需要存放 ...

我做过正确答案了,就是想不通明明这样算远比正确答案的数大的多才对呀,而unsigned long long 能够表示最大的数字是有限的,那我这个也应该是表示的最大数:18446744073709551615才对鸭
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 17:03:23 | 显示全部楼层
qiuyouzhi 发表于 2020-3-14 17:01
你看看结果吧

我现在也有亿点点蒙。。

4
3
16
7
256
23
65536
279
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
0
65815
舍罕王应该给予达依尔4295033111粒麦子!

--------------------------------
Process exited after 0.06309 seconds with return value 0
请按任意键继续. . .


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 17:05:01 | 显示全部楼层

到了65536之后就不往上乘了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 17:07:36 | 显示全部楼层
qiuyouzhi 发表于 2020-3-14 17:05
到了65536之后就不往上乘了

啊,我好像知道问题在哪了。。。。temp是不是太大了,没放放在pow(temp,2)里面啊
不然就是这样啦pow(999999999999999999, 2),噗,怪不得
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 17:09:42 | 显示全部楼层    本楼为最佳答案   
彭格列XI代 发表于 2020-3-14 17:07
啊,我好像知道问题在哪了。。。。temp是不是太大了,没放放在pow(temp,2)里面啊,
不然就 ...
  1. #include <stdio.h>
  2. #include <math.h>


  3. int main(void)
  4. {
  5.      
  6.          unsigned long long int sum = 3;
  7.          unsigned long long int temp = 2;
  8.          unsigned long long int weight;
  9.          int i = 1;
  10.          
  11.          while(i < 63)
  12.          {
  13.             
  14.                  temp = pow(temp, 2);
  15.                  printf("%llu\n", temp);
  16.                  sum += temp;
  17.                  
  18.                  i++;
  19.          }
  20.          
  21.          printf("舍罕王应该给予达依尔%llu粒麦子!\n", sum);
  22.          
  23.          return 0;
  24.          
  25. }
复制代码

抱歉啊,刚才我傻了
你看这段代码最大的结果,它乘上去之后
就太大了,temp装不下,就只能为0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 17:12:10 | 显示全部楼层
彭格列XI代 发表于 2020-3-14 17:07
啊,我好像知道问题在哪了。。。。temp是不是太大了,没放放在pow(temp,2)里面啊,
不然就 ...

你可以这么算一下:
3+4+16+256+65535+4,295,033,108
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 17:12:32 | 显示全部楼层
qiuyouzhi 发表于 2020-3-14 17:09
抱歉啊,刚才我傻了
你看这段代码最大的结果,它乘上去之后
就太大了,temp装不下,就只能为0{:10_25 ...

4
16
256
65536
4294967296
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
舍罕王应该给予达依尔4295033111粒麦子!

--------------------------------
Process exited after 0.03074 seconds with return value 0
请按任意键继续. . .


果然还是因为撑爆了吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 17:13:36 | 显示全部楼层

嗯嗯,具体看楼上
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 17:16:11 | 显示全部楼层
qiuyouzhi 发表于 2020-3-14 17:13
嗯嗯,具体看楼上

好吧,问题解决啦,谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 17:16:47 | 显示全部楼层
彭格列XI代 发表于 2020-3-14 17:16
好吧,问题解决啦,谢谢大佬

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-15 09:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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