1. 程式人生 > >C語言舍罕王的失算程式碼及解析

C語言舍罕王的失算程式碼及解析

問題描述

相傳國際象棋是古印度舍罕王的宰相達依爾發明的。舍罕王十分喜愛象棋,決定讓宰相自己選擇何種賞賜。這位聰明的宰相指著 8×8 共64格的象棋棋盤說:陛下,請您賞給我一些麥子吧。就在棋盤的第1格中放1粒,第2格放2粒,第3格放4粒,以後每一格都比前一格增加一倍,依此放完棋盤上64格,我就感激不盡了。舍罕王讓人扛來一袋麥子,他要兌現他的許諾。請程式設計求出國王總共需要將多少麥子賞賜給他的宰相。

該問題描述比較複雜,但只要抽象出其數學模型,便很容易解決了。

根據題意,麥子的放法是:在棋盤的第1格中放1粒,第2格放2粒,第3格放4粒,以後每一格都比前一格增加一倍,依次放完棋盤上64格。

由此可推知,按照如此放法可得到的麥子的總數為:

演算法設計

在問題分析中已經將所需麥子的總數抽象為數學公式:

現在只要考慮如何設計演算法實現累加和即可。顯然,可釆用迴圈結構,每迴圈一次就實現一次累加,總共迴圈64次可獲得累加和。

下面是完整的程式:

#include <stdio.h>
#include <math.h>
int main()
{
    double sum = 0;  /*定義double型變數sum存放累加和*/
    int i;
    /*使用迴圈求累加和*/
    for( i=1; i<=64; i++ )
        sum = sum + pow(2.0, (i-1));  /*注意變數為double型*/
    printf("國王需要賞賜給宰相的麥子總數為:\n%f\n", sum);  /*列印結果*/
    return 0;
}

國王需要賞賜給宰相的麥子總數為:
18446744073709551616.000000

C語言舍罕王的失算程式碼及解析