鱼C论坛

 找回密码
 立即注册
查看: 2266|回复: 6

[已解决]有没有大神解释一下其中的原理

[复制链接]
发表于 2023-4-10 17:34:25 | 显示全部楼层 |阅读模式

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

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

x
相传国际象棋是古印度舍罕王的宰相达依尔发明的。
舍罕王十分喜爱国际象棋,便决定让宰相自己选择何种赏赐。这位聪明的宰相指着 8×8 共 64 格的象棋棋盘说:陛下,请您赏给我一些麦子吧。就在棋盘的第 1 格中放 1 粒,第 2 格放 2 粒,第 3 格放 4 粒,以后每一格都比前一格增加一倍,依此放完棋盘上 64 格,我就感激不尽了……
舍罕王听了达依尔这个“小小”的要求,便让人扛来一袋麦子,他要兑现许诺。结果,在给达依尔发放麦子时,舍罕王发现他要给达依尔的麦子比自己想象的要多得多,一袋麦子是远远不够的……

请编程计算舍罕王应该给达依尔多少粒麦子?0;d^

i = 1
sum = 0

while i <= 64:
    wheats = pow(2, i-1)
    sum = sum + wheats
    i = i + 1

print("舍罕王应该给达依尔", sum, "粒麦子!")
最佳答案
2023-4-10 17:39:46
isdkz 发表于 2023-4-10 17:36
这个故事中的原理是指数级数。宰相提出的要求实际上是一个数学问题,要求在象棋棋盘上每个格子的麦子数是前 ...


我来尽量用通俗易懂的方式解释这个故事中的原理。

我们先来看宰相提出的要求:在 8×8 的国际象棋棋盘上,第 1 格放 1 粒麦子,第 2 格放 2 粒麦子,第 3 格放 4 粒麦子,以此类推,每个格子的麦子数是前一个格子的两倍。这个要求的核心就是指数增长。

指数增长是指一个量按照某个固定比例迅速增加。在这个故事中,麦子的数量就是按照 2 的幂次增长的。我们可以这样理解:

  • 第 1 格:2^0 = 1 粒麦子
  • 第 2 格:2^1 = 2 粒麦子
  • 第 3 格:2^2 = 4 粒麦子
  • 第 4 格:2^3 = 8 粒麦子


以此类推,第 64 格的麦子数是 2^63 粒。

指数增长在初始阶段看起来增长缓慢,但随着次数的增加,增长速度会变得非常快。在这个故事中,棋盘上麦子的数量迅速变得非常庞大,让舍罕王感到意外。

要计算棋盘上总共需要多少粒麦子,我们需要把每个格子的麦子数加起来。这个求和过程可以用一个数学公式表示:

总麦子数 = 2^0 + 2^1 + 2^2 + ... + 2^63

这个公式计算的结果是 18,446,744,073,709,551,615 粒麦子。这个数目远超过了舍罕王的预期,凸显了指数增长的强大力量。

通过这个故事,我们可以理解到,指数增长在一开始可能看起来微不足道,但随着时间的推移,其增长速度会变得非常惊人。这种现象在生活中的很多领域都有体现,比如金融投资、科技进步和人口增长等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-10 17:36:20 | 显示全部楼层
本帖最后由 sfqxx 于 2023-4-10 18:00 编辑

这个故事和问题其实是关于指数增长的一个经典案例。

在这个问题中,达依尔要求舍罕王每一格放置的麦子数量依次加倍。也就是说,在第一格放 1 粒,第二格放 2 粒,第三格放 4 粒,第四格放 8 粒,以此类推。

为了计算总共需要多少粒麦子,我们可以使用循环来计算每一格放置的麦子数量,然后将它们相加即可。

这里的代码实现了这一过程。在 while 循环中,计算当前格子应该放置的麦子数量,然后将其加到之前所有格子的麦子数量总和上。最终输出总共需要多少粒麦子。

这个问题的答案是:18,446,744,073,709,551,615 粒麦子。
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-10 17:36:37 | 显示全部楼层
这个故事中的原理是指数级数。宰相提出的要求实际上是一个数学问题,要求在象棋棋盘上每个格子的麦子数是前一个格子的两倍。当你完成这个过程时,最后得到的麦子总数会非常惊人。

编程代码中,我们需要计算舍罕王给达依尔多少粒麦子。我们设定一个循环,从第1格到第64格,每次格子的麦子数是前一格的两倍。具体步骤如下:

1、初始化变量 i(表示当前格子)为 1,sum(表示麦子总数)为 0。
2、当 i 小于等于 64 时,执行循环。
a. 计算当前格子的麦子数:wheats = pow(2, i-1),即 2^(i-1)。
b. 将当前格子的麦子数累加到总数:sum = sum + wheats。
c. i 自增 1,即 i = i + 1。
3、循环结束后,打印出麦子总数。

这段代码计算出舍罕王应该给达依尔的麦子总数为:18,446,744,073,709,551,615粒。从这个结果可以看出,宰相的要求远超过了舍罕王的预期,所需麦子的数量是非常庞大的。这个故事也说明了指数增长的强大力量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-10 17:39:46 | 显示全部楼层    本楼为最佳答案   
isdkz 发表于 2023-4-10 17:36
这个故事中的原理是指数级数。宰相提出的要求实际上是一个数学问题,要求在象棋棋盘上每个格子的麦子数是前 ...


我来尽量用通俗易懂的方式解释这个故事中的原理。

我们先来看宰相提出的要求:在 8×8 的国际象棋棋盘上,第 1 格放 1 粒麦子,第 2 格放 2 粒麦子,第 3 格放 4 粒麦子,以此类推,每个格子的麦子数是前一个格子的两倍。这个要求的核心就是指数增长。

指数增长是指一个量按照某个固定比例迅速增加。在这个故事中,麦子的数量就是按照 2 的幂次增长的。我们可以这样理解:

  • 第 1 格:2^0 = 1 粒麦子
  • 第 2 格:2^1 = 2 粒麦子
  • 第 3 格:2^2 = 4 粒麦子
  • 第 4 格:2^3 = 8 粒麦子


以此类推,第 64 格的麦子数是 2^63 粒。

指数增长在初始阶段看起来增长缓慢,但随着次数的增加,增长速度会变得非常快。在这个故事中,棋盘上麦子的数量迅速变得非常庞大,让舍罕王感到意外。

要计算棋盘上总共需要多少粒麦子,我们需要把每个格子的麦子数加起来。这个求和过程可以用一个数学公式表示:

总麦子数 = 2^0 + 2^1 + 2^2 + ... + 2^63

这个公式计算的结果是 18,446,744,073,709,551,615 粒麦子。这个数目远超过了舍罕王的预期,凸显了指数增长的强大力量。

通过这个故事,我们可以理解到,指数增长在一开始可能看起来微不足道,但随着时间的推移,其增长速度会变得非常惊人。这种现象在生活中的很多领域都有体现,比如金融投资、科技进步和人口增长等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-10 18:20:28 | 显示全部楼层
isdkz 发表于 2023-4-10 17:39
我来尽量用通俗易懂的方式解释这个故事中的原理。

我们先来看宰相提出的要求:在 8×8 的国际象棋棋 ...

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

使用道具 举报

发表于 2023-4-10 18:27:13 | 显示全部楼层
这道题目需要用到指数运算。在棋盘的第n格上放置的麦粒数量可以用2的n-1次方来表示。因此,舍罕王应该给达依尔的麦子数量为:2的64次方减1。

具体的编程实现如下:

c语言版:
#include <stdio.h>
#include <math.h>

int main() {
    int i;
    double grains = 1.0;  // 初始放入第一格
    double total_grains = 0.0;  // 总共需要的麦子数

    for (i = 2; i <= 64; i++) {
        grains *= 2;  // 每格放的麦子数是前一格的两倍
    }

    total_grains = grains * 64;  // 计算总共需要的麦子数
    printf("舍罕王需要给达依尔 %g 粒麦子。\n", total_grains);

    return 0;
}
cpp版:
#include <iostream>
#include <cmath>

using namespace std;

int main() {
    int i;
    double grains = 1.0;  // 初始放入第一格
    double total_grains = 0.0;  // 总共需要的麦子数

    for (i = 2; i <= 64; i++) {
        grains *= 2;  // 每格放的麦子数是前一格的两倍
    }

    total_grains = grains * 64;  // 计算总共需要的麦子数
    cout << "舍罕王需要给达依尔 " << total_grains << " 粒麦子。" << endl;

    return 0;
}
Python版:
grains = 1  # 初始放入第一格
total_grains = 0  # 总共需要的麦子数

for i in range(2, 65):
    grains *= 2  # 每格放的麦子数是前一格的两倍

total_grains = grains * 64  # 计算总共需要的麦子数
print("舍罕王需要给达依尔 %d 粒麦子。" % total_grains)
C#版:
using System;

public class Program {
    public static void Main() {
        int i;
        double grains = 1.0;  // 初始放入第一格
        double total_grains = 0.0;  // 总共需要的麦子数

        for (i = 2; i <= 64; i++) {
            grains *= 2;  // 每格放的麦子数是前一格的两倍
        }

        total_grains = grains * 64;  // 计算总共需要的麦子数
        Console.WriteLine("舍罕王需要给达依尔 {0} 粒麦子。", total_grains);
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-10 19:32:52 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 21:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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