印度有一个饶有趣味的故事。传说舍罕王打算重赏象棋的发明人、宰相西萨达依尔。国王问他有何要求,这位聪明的大臣胃口看来并不大,他跪在国王面前说:"陛下,请您在这张棋盘的第一个小格内,赏给我一粒麦子,在第二个小格内给两粒,第三格内给四粒,照这样下去,每一个小格内都比前一小格加一倍。陛下啊,把这样摆满棋盘上所有64格的麦粒,都赏给您的仆人罢。"国王一听,认为这区区赏金,微不足道。于是,满口答应道:"爱卿,你所求的并不多啊,你当然会如愿以偿。"
问题:舍罕王需要赏赐出多少粒麦子.
package suanfa;
import java.util.Scanner;
public class Example_1 {
/**
* 舍罕王赏麦算法
*/
static double mai(int n)
{
int i;
double temp,sum;
temp=1;
sum=1;
for(i=1;i<=n-1;i++)
{
temp=temp*2;
sum=sum+temp;
}
return sum;
}
public static void main(String[] args) {
int n;
double sum;
System.out.printf("舍罕王赏麦问题求解!\n");
System.out.printf("输入棋盘格总数:");
Scanner input=new Scanner(System.in);
n=input.nextInt();
sum=mai(n);
System.out.printf("舍罕王赏总麦粒数为:%f粒,\n",sum);
}
}
结果 为
舍罕王赏麦问题求解!
输入棋盘格总数:64
舍罕王赏总麦粒数为:18446744073709552000.000000粒,
而实际的真实结果是18446744073709551616,原因是因为double的有效位是16位(十进制),小数点后面默认输出6位