C语言--棋盘麦粒问题
1.背景故事在印度有一个古老的传说:舍罕王打算奖赏国际象棋的发明人——宰相西萨·班·达依尔。国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里,赏给我1粒麦子,在第2个小格里给2粒,第3小格给4粒,以后每一小格都比前一小格加一倍。请您把这样摆满棋盘上所有的64格的麦粒,都赏给您的仆人吧!”国王觉得这要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,国王才.
·
1.背景故事
在印度有一个古老的传说:舍罕王打算奖赏国际象棋的发明人——宰相西萨·班·达依尔。国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里,赏给我1粒麦子,在第2个小格里给2粒,第3小格给4粒,以后每一小格都比前一小格加一倍。请您把这样摆满棋盘上所有的64格的麦粒,都赏给您的仆人吧!”国王觉得这要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。 那么,宰相要求得到的麦粒到底有多少呢?总数为:
第 第 第 第 第
1 2 3 4 …… 64
格 格 格 格 格
1 + 2 + 4+ 8 + ……… + 2的63次方 = 2的64次方-1
= 18446744073709551615(粒)
人们估计,全世界需要500年生产这么多麦子!
2.代码验证
#include <stdio.h>
#define pane_num 64 //方格数
void grains_total(); //计算米粒函数声明
int main()
{
grains_total();
return 0;
}
void grains_total()
{
int count = 0; //记录方格数
double total = 0; //记录米粒总数
double current = 0.5; //记录当前方格的米粒数
printf("pane_num current total\n");
while (count < pane_num)
{
count = count + 1;
current = current * 2;
total = total + current;
printf("%5d %15.4e %12.2e\n", count, current, total); //每计算一个方格的米粒数便打印出来。其中15.4e中15表示空白字段数,.4表示取的小数的有效位数。
}
}
3.验证结果

4.参考&&致谢
更多推荐

所有评论(0)