算法-經典趣題-舍罕王賞麥


一、問題

舍罕王賞麥問題是古印度非常著名的一個級數求和問題。

傳說國際象棋的發明者是古印度的西薩·班·達依爾。那時的國王是舍罕,世人稱為舍罕王。當時舍罕王比較貪玩,位居宰相的西薩·班·達依爾便發明了國際象棋獻給舍罕王。舍罕王非常喜歡,為了獎勵西薩·班·達依爾,便許諾可以滿足他提出的任何要求。

西薩·班·達依爾靈機一動,指着8×8=64的棋盤說:“陛下,請您按棋盤的格子賞賜我一點麥子吧,第1個小格賞我一粒麥子,第2個小格賞我兩粒,第3個小格賞四粒,以后每一小格都比前一個小格賞的麥粒數增加一倍,只要把棋盤上全部64個小格按這樣的方法得到的麥粒都賞賜給我,我就心滿意足了。”舍罕王覺得這是一個很小的要求,便滿口答應了,命人按要求給西薩·班·達依爾准備麥子。但是,不久大臣計算的結果令舍罕王大驚失色。問題是:舍罕王需要賞賜多少粒麥子呢?

二、分析

我們來分析下這個問題,國際象棋棋盤總共有8×8=64格。按照西薩·班·達依爾的要求,每一格中放置的麥粒數量如下。

第1格:1粒;

第2格:1×2=2粒;

第3格:1×2×2=4粒;

第4格:1×2×2×2=8粒;

……

將每一格的麥子粒數加起來:sum=1+2+4+8+……

一直重復到64,將棋盤8×8=64格都計算完畢便可以計算出賞賜給西薩·班·達依爾總的麥粒數。如果使用數學的語言來描述,上述式子可以表述為如下形式:

 

 

 

三、編程

package com.joshua317;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int n;//棋盤總數
        double sum;//總的麥粒數
        System.out.println("漢王舍麥問題求解");
        System.out.println("輸入棋盤總數:");
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        sum = hanWangSheMai(n);
        System.out.printf("總麥粒數為:%f \n", sum);
        //假定25000粒麥子為1公斤,那么25000000粒麥子為1噸
        System.out.printf("總噸數為:%.2f \n", sum/25000/1000);
    }

    /**
     * @author joshua317
     * @param  n 棋盤數
     * @return double 返回的總數
     */
    public static double hanWangSheMai(int n)
    {
        int i;
        double sum = 0;
        double temp = 1;
        for (i = 0; i < n; i++) {
            sum = sum + temp;
            temp = temp * 2;
        }
        return sum;
    }
}

注意:假定25000粒麥子為1公斤,那么25000000粒麥子為1噸

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM