舍罕王失算
国际象棋是古印度舍罕王的宰相达依尔发明的,舍罕王奖励宰相自己要求奖励,宰相指着8*8共64格的棋盘说:“陛下,请您赏给我一些麦子吧,就在棋盘的第1格中放1粒,第2个放2粒,第3格放4粒,以后每一格都比前一格增加一倍,以此放完棋盘上的64格,我就感激不尽了。”舍罕王让人扛来一袋麦子,他要兑现他的许诺。
问题:
摆放完棋盘上的64格共要多少麦子赏赐他的宰相?
这些小麦合多少吨(1吨小麦约 2.4e7 粒)?
这些小麦相当于世界粮食年总产量(以 2014 年度数据 2.48e9 吨计)的多少倍?
设计求解要点:
这是一个典型的等比数列求解问题。
第一格 1 粒,第二格 2 粒,第三格 4=2*2 粒,……,第 i 格为2^(i-1)粒,于是总粒数为:
s = 1+2+4+8+……+2^63
为一般计,设共有 n 个格。
设置求和 i (2~n) 循环,在循环中通过 t=t*2 计算第 i 格的麦粒数,体现每一格为其前一格的 2 倍。再通过 s=s+t 把每一格的麦粒数累加到和变量 s,即可实现该等比数列各项的求和。求出的总粒数为 s ,通过 v=s/2.4e7 把 s 粒小麦的重量折合为 v 吨。
p = v/2.48e9
所得 p 即为相当于全世界粮食总产量的倍数。
程序设计:
#include <stdio.h>
#include <math.h>
int main()
{
double t, s, v, p;
int i, n;
printf(" 请输入格数 n :>_ ");
scanf("%d", &n);
t = 1;
s = 1;
for (i = 2; i <= n; i++)
{
t = t * 2;
s = s + t;
}
v = s / 2.4e7;
p = v / 2.48e9;
if (n <= 40)
{
printf(" 总麦粒数为:%.0f\n", s);
}
else
{
printf(" 总麦粒数约为:%.3e\n", s);
}
printf(" 小麦重量约为:%.0f 吨\n", v);
printf(" 约相当于世界粮食年总产量的%.0f倍\n", p);
return 0;
}
程序运行示例: