鱼C论坛

 找回密码
 立即注册
查看: 4214|回复: 14

[已解决]救救孩子吧,讲题!!

[复制链接]
发表于 2022-7-16 21:36:58 | 显示全部楼层 |阅读模式

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

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

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

s1e6课后作业最后大题有没有大佬讲解讲解,不看答案是真不会
引用: 相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜爱象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着 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: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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-16 21:45:41 | 显示全部楼层
题目是什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-16 21:49:11 From FishC Mobile | 显示全部楼层
临时号 发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-17 08:41:58 From FishC Mobile | 显示全部楼层
本帖最后由 枫_R 于 2022-7-17 08:43 编辑
临时号 发表于 2022-7-16 21:58
从for循环开始解释啊,前面的变量定义你应该都看得懂
一开始,i=0
将2的0次方也就是1赋值给了temp变量,此时 ...


好像确实打开了我的任督二脉,有点懂了
这句  for (i=0; i < 64; i++)   是啥意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-17 08:42:47 From FishC Mobile | 显示全部楼层
柿子饼同学 发表于 2022-7-16 21:53
知识 : 数据范围 特别 , 特别, 特别 大的时候可以用(当数据只有正数时 , 因为unsigned把原来long long  ...

这个解答是很好,但是新手表示有点难懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-17 09:45:23 | 显示全部楼层
枫_R 发表于 2022-7-17 08:42
这个解答是很好,但是新手表示有点难懂


屏幕截图 2022-07-17 094349.png
如图 , 以 16 个格子为例 , 每个格子的麦子即为 2 ^ i 累计加起来就是答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-17 09:48:18 From FishC Mobile | 显示全部楼层
柿子饼同学 发表于 2022-7-17 09:45
如图 , 以 16 个格子为例 , 每个格子的麦子即为 2 ^ i 累计加起来就是答案

for (i=0; i < 64; i++)
这句的i++是什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-17 14:36:17 From FishC Mobile | 显示全部楼层
柿子饼同学 发表于 2022-7-17 13:52
就是它是一个循环
条件是 i 从 0 开始 , 小于 64
每次循环如果满足上述条件 , i 就自增 1

懂啦懂啦,谢谢大佬解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-17 14:36:57 From FishC Mobile | 显示全部楼层
临时号 发表于 2022-7-17 11:02
i++表示的是每次循环后i加1,目的是为了让i充当一个计数器,使for循环循环64次
for循环的标准格式:https:/ ...

懂啦,谢谢大佬解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-17 14:51:44 | 显示全部楼层
枫_R 发表于 2022-7-17 14:36
懂啦,谢谢大佬解答

如果问题解决了,不要忘了设置最佳答案哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-17 17:05:44 | 显示全部楼层
不懂,纯支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 10:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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