题目描述:
在印度有一个古老的传说:舍罕王打算奖赏国际象棋的发明人——宰相西萨·班·达依尔。国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里,赏给我1粒麦子,在第2个小格里给2粒,第3小格给4粒,以后每一小格都比前一小格加一倍。请您把这样摆满棋盘上所有的64格的麦粒,都赏给您的仆人吧!”国王觉得这要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。那么,宰相要求得到的麦粒到底有多少呢?
输入:
仅一行,1个整数n(0<n<=64)表示已经放了几个小格。
输出:
已经放置的麦粒数。
输入样例:
3
输出样例:
7
题解:对于本题,如果不考虑精度的话,很简单。但是要考虑到精度问题,就相当于大数运算了,需要考虑的细节很多。大数运算,C语言可以利用数组或字符串,其实字符串也就是数组。那我们就可以通过数组进行运算。在这里我定义了两个函数,一个函数为乘2函数,一个函数为求和函数。让我们直接看代码吧:
#include<stdio.h>
void multi2(int a[])
{
int carry=0,i;
for(i=999;i>=0;i–){
int tmp=a[i]*2;
a[i]=tmp%10+carry;
carry=tmp/10;
}
}
void plus(int sum[],int add[])
{
int carry=0;//进位
int i;
for(i=999;i>=0;i–){
int tmp=sum[i]+add[i];
sum[i]=tmp%10+carry;
carry=tmp/10;
}
}
int main()
{
int sum[1000]={0};
int add[1000]={0};
int n,i;
scanf("%d",&n);
add[999]=1;//设定个位
for(i=0;i<n;i++)
{
plus(sum,add);
multi2(add);
}
int k;
for(i=0;i<1000;i++)
{
if(sum[i]!=0){
k=i;//找一个不为0的开始输出。
break;
}
}
for(i=k;i<1000;i++){
printf("%d",sum[i]);
}
printf("\n");
return 0;
}
围棋盘放麦粒
最新推荐文章于 2023-10-16 16:40:48 发布