题目描述:阿基米德与国王下棋的故事
有一位国王与数学家阿基米德下棋。国王说我们这样干下棋好象不够刺激,要么赌点什么吧!阿基米德说好啊。国王说,如果我下赢了,你就给我打一辈子长工。阿基米德说行啊。国王问阿基米德,那你要是赢了呢?阿基米德看了看国王家的粮仓,说:我要是赢了,你就在棋盘格子里放上米粒就行了。国王问:怎么个放法呀?阿基米德说:棋盘一共就这么多格子,你要是输了,就在第一个格子里放一粒米,在第二个格子里放两粒米,在
第三个格子里放四粒米,以此类推,以后每个格子放的米粒都是上一格的一倍,放完就行了。国王心想,我家有那么大的粮仓,别说这么个小小棋盘了,就是再大的棋盘也能装得下呀。于是他欣然答应,而且还吩咐手下准备笔墨,跟阿基米德签了约。结果阿基米德赢了棋。国王呢,在兑现承诺的时候才发现,别说他那一个粮仓,就是再多几个粮仓也填不满那个小小的棋盘。
这个故事中阿基米德所应用的
数学原理就是几何倍增原理。这个数学模型的可怕之处在于,如果一个数字大于或等于2,那么按几何级数增加时,其倍增的速率是十分惊人的。如果把第一个格子的一粒米写成2的0次方,第二个格子写成2的1次方,第三个格子写成2的2次方,那么第N个格子就可以写成2的N-1次方。国际象棋一共 64个格子。到了第64个格子的时候,需要放的米粒数就是2的63次方,如果1000粒米有一克重,那么折算一下,第64格就需要放米
9223372036吨。这么大的数字,看来国王只能把国家交出来了。试着编写一个程序,给定非负整数n,
求2”。
#include
#include
answer=pow(2n);//将2n次方的结果赋值给变量 answer,pow(a,b)求a的b次方。
输入n 求answer的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
int main()
{
int n;
double answer;
scanf("%d", &n);
answer = pow(2.0, n);
printf("%lf", answer);
return 0;
}
下面是计算总共需要多少米和重量的代码,你的题目贴的不全,估计是要第一个代码。下面这个代码供参考吧。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
int main()
{
int a;
double s = 0;
for (a = 1; a <= 64; a++) {
s += pow(2.0, a - 1);
}
printf("国王总共要给%lf粒米\n", s);
printf("这些米总共约%.2lf吨\n", s /pow(10.0,9) ); //结果保留2位小数,1000粒米=1克,1千克=10^6,1吨=10^9
return 0;
}
写了一大堆,最后就是个pow(2,n)就行了啊
#include <stdio.h>
#include <math.h>
int main()
{
int n;
double answer;
scanf("%d",&n);
answer = pow(2.0,n);
printf("%.0lf",answer);
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!