彭格列XI代 发表于 2020-3-14 16:40:32

有大佬进来帮忙看看吗qwq

相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜爱象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着 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呀,可是为什么反而得出的数那么短呢。。。{:10_266:}

qiuyouzhi 发表于 2020-3-14 16:41:53

本帖最后由 qiuyouzhi 于 2020-3-14 16:44 编辑

pow写反了,应是pow(2, temp)
提示:计算每一格要存放多少麦子,可以使用 pow(2, i) 计算出每一格需要存放的麦子数,然后存放到 temp 变量中。
这是小甲鱼的原话,你不会只看了眼题目吧。。。

墨羽岚 发表于 2020-3-14 16:44:15

乘号变加号。。。{:10_247:}不愧是你

qiuyouzhi 发表于 2020-3-14 16:45:01

墨羽岚 发表于 2020-3-14 16:44
乘号变加号。。。不愧是你

没有的,他写对了,是+

墨羽岚 发表于 2020-3-14 16:49:56

qiuyouzhi 发表于 2020-3-14 16:45
没有的,他写对了,是+

我看错了{:10_247:}不愧是我
话说pow函数不是要有个双精度还是浮点来着吗{:10_257:}

qiuyouzhi 发表于 2020-3-14 16:50:24

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

那倒不用,除非你想保留两位

墨羽岚 发表于 2020-3-14 16:51:17

qiuyouzhi 发表于 2020-3-14 16:50
那倒不用,除非你想保留两位

好的,谢谢{:10_282:}

彭格列XI代 发表于 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这样...

qiuyouzhi 发表于 2020-3-14 17:01:35

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

你看看结果吧
#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);
               printf("%d\n", temp);
               printf("%d\n", sum);
               sum = sum + temp;
               
               i++;
         }
         
         printf("舍罕王应该给予达依尔%llu粒麦子!\n", sum);
         
         return 0;
         
}
我现在也有亿点点蒙。。

彭格列XI代 发表于 2020-3-14 17:01:49

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

我做过正确答案了,就是想不通明明这样算远比正确答案的数大的多才对呀,而unsigned long long 能够表示最大的数字是有限的,那我这个也应该是表示的最大数:18446744073709551615才对鸭{:10_266:}

彭格列XI代 发表于 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
请按任意键继续. . .


qiuyouzhi 发表于 2020-3-14 17:05:01

彭格列XI代 发表于 2020-3-14 17:03
4
3
16


到了65536之后就不往上乘了

彭格列XI代 发表于 2020-3-14 17:07:36

qiuyouzhi 发表于 2020-3-14 17:05
到了65536之后就不往上乘了

啊,我好像知道问题在哪了。。。。temp是不是太大了,没放放在pow(temp,2)里面啊{:10_250:},
不然就是这样啦pow(999999999999999999, 2),噗,怪不得{:10_250:}

qiuyouzhi 发表于 2020-3-14 17:09:42

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

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


int main(void)
{
   
         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);
               printf("%llu\n", temp);
               sum += temp;
               
               i++;
         }
         
         printf("舍罕王应该给予达依尔%llu粒麦子!\n", sum);
         
         return 0;
         
}
抱歉啊,刚才我傻了
你看这段代码最大的结果,它乘上去之后
就太大了,temp装不下,就只能为0{:10_250:}

qiuyouzhi 发表于 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

彭格列XI代 发表于 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
请按任意键继续. . .


果然还是因为撑爆了吧{:10_247:}

qiuyouzhi 发表于 2020-3-14 17:13:36

彭格列XI代 发表于 2020-3-14 17:12
4
16
256


嗯嗯,具体看楼上

彭格列XI代 发表于 2020-3-14 17:16:11

qiuyouzhi 发表于 2020-3-14 17:13
嗯嗯,具体看楼上

好吧,问题解决啦,谢谢大佬{:10_298:}

qiuyouzhi 发表于 2020-3-14 17:16:47

彭格列XI代 发表于 2020-3-14 17:16
好吧,问题解决啦,谢谢大佬

{:10_256:}
页: [1]
查看完整版本: 有大佬进来帮忙看看吗qwq