围棋盘放麦粒

题目描述:
在印度有一个古老的传说:舍罕王打算奖赏国际象棋的发明人——宰相西萨·班·达依尔。国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第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;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44124848

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值