枫_R 发表于 2022-7-16 21:36:58

救救孩子吧,讲题!!

本帖最后由 枫_R 于 2022-7-16 21:49 编辑

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

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

代码如下
#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粒麦子为1kg,那么应该给%llu公斤麦子!\n", weight);

      return 0;
}

临时号 发表于 2022-7-16 21:45:41

题目是什么

枫_R 发表于 2022-7-16 21:49:11

临时号 发表于 2022-7-16 21:45
题目是什么

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

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

#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粒麦子为1kg,那么应该给%llu公斤麦子!\n", weight);

      return 0;
}

柿子饼同学 发表于 2022-7-16 21:53:08

本帖最后由 柿子饼同学 于 2022-7-16 21:54 编辑

知识 : 数据范围 特别 , 特别, 特别 大的时候可以用(当数据只有正数时 , 因为unsigned把原来long long 的符号位也拿来存值了 , 所以不能表示负数)
unsigned long long
类型存放
第一个放一粒 , 之后每个格子都是前面的两倍,易得:
// 先循环 i 从 0 到 63
ans += pow(2, i);
然后 unsigned long long 用 printf 输出要用 %llu
其中两个 l 就是 long 的首字母 ,u 是 unsigned 首字母#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粒麦子为1kg,那么应该给%llu公斤麦子!\n", weight);

      return 0;
}

临时号 发表于 2022-7-16 21:58:10

从for循环开始解释啊,前面的变量定义你应该都看得懂
一开始,i=0
将2的0次方也就是1赋值给了temp变量,此时temp=1
然后,将temp与sum相加赋值给sum,此时sum=1
然后,i=1
将2的1次方也就是2赋值给了temp变量,此时temp=2
然后,将temp与sum相加赋值给sum,此时sum=3
然后,i=2
将2的2次方也就是4赋值给了temp变量,此时temp=4
然后,将temp与sum相加赋值给sum,此时sum=7
一次类推,执行64次
你发现没,这不就是1+2+4+....=sum吗,这样就可以算出舍罕王要给宰相的麦子,并将它赋值给sum
然后,weight = sum / 25000;这句应该懂吧,我就不解释了
最后输出了sum和weight

枫_R 发表于 2022-7-17 08:41:58

本帖最后由 枫_R 于 2022-7-17 08:43 编辑

临时号 发表于 2022-7-16 21:58
从for循环开始解释啊,前面的变量定义你应该都看得懂
一开始,i=0
将2的0次方也就是1赋值给了temp变量,此时 ...

好像确实打开了我的任督二脉,有点懂了{:10_266:}
这句for (i=0; i < 64; i++)   是啥意思

枫_R 发表于 2022-7-17 08:42:47

柿子饼同学 发表于 2022-7-16 21:53
知识 : 数据范围 特别 , 特别, 特别 大的时候可以用(当数据只有正数时 , 因为unsigned把原来long long...

这个解答是很好,但是新手表示有点难懂{:10_245:}

柿子饼同学 发表于 2022-7-17 09:45:23

枫_R 发表于 2022-7-17 08:42
这个解答是很好,但是新手表示有点难懂


如图 , 以 16 个格子为例 , 每个格子的麦子即为 2 ^ i 累计加起来就是答案

枫_R 发表于 2022-7-17 09:48:18

柿子饼同学 发表于 2022-7-17 09:45
如图 , 以 16 个格子为例 , 每个格子的麦子即为 2 ^ i 累计加起来就是答案

for (i=0; i < 64; i++)
这句的i++是什么意思

临时号 发表于 2022-7-17 11:02:56

枫_R 发表于 2022-7-17 09:48
for (i=0; i < 64; i++)
这句的i++是什么意思

i++表示的是每次循环后i加1,目的是为了让i充当一个计数器,使for循环循环64次
for循环的标准格式:https://www.runoob.com/cprogramming/c-for-loop.html

柿子饼同学 发表于 2022-7-17 13:52:44

枫_R 发表于 2022-7-17 09:48
for (i=0; i < 64; i++)
这句的i++是什么意思

就是它是一个循环
条件是 i 从 0 开始 , 小于 64
每次循环如果满足上述条件 , i 就自增 1
i++ 等价于 i = i + 1 或 i += 1

枫_R 发表于 2022-7-17 14:36:17

柿子饼同学 发表于 2022-7-17 13:52
就是它是一个循环
条件是 i 从 0 开始 , 小于 64
每次循环如果满足上述条件 , i 就自增 1


懂啦懂啦,谢谢大佬解答

枫_R 发表于 2022-7-17 14:36:57

临时号 发表于 2022-7-17 11:02
i++表示的是每次循环后i加1,目的是为了让i充当一个计数器,使for循环循环64次
for循环的标准格式:https:/ ...

懂啦,谢谢大佬解答

临时号 发表于 2022-7-17 14:51:44

枫_R 发表于 2022-7-17 14:36
懂啦,谢谢大佬解答

如果问题解决了,不要忘了设置最佳答案哦

skysku112 发表于 2022-7-17 17:05:44

不懂,纯支持
页: [1]
查看完整版本: 救救孩子吧,讲题!!