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.参考&&致谢

百度百科

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐