2917 - 国际象棋上的麦粒

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

   传说西塔发明了国际象棋而使国王十分高兴,他决定要重赏西塔,西塔说:“我不要你的重赏 ,陛下,只要你在我的棋盘上赏一些麦子就行了。在棋盘的第1个格子里放1粒,在第2个格子里放2粒,在第3个格子里放4粒,在第4个格子里放8粒,依此类推,以后每一个格子里放的麦粒数都是前一个格子里放的麦粒数的2倍,直到放满第64个格子就行了”。区区小数,几粒麦子,这有何难,“来人”,国王令人如数付给西塔。 

    计数麦粒的工作开始了,第一格内放1粒,第二格内放2粒,第三格内放22粒,…还没有到第二十格,一袋麦子已经空了。一袋又一袋的麦子被扛到国王面前来。但是,麦粒数一格接一格飞快增长着,国王很快就看出,即便拿出全国的粮食,也兑现不了他对西塔的诺言。 

    那么,你能计算出到第N格时,共需要多少麦粒吗?

题目输入

一行:一个整数N,1<=N<=64

题目输出

一行:一个整数

输入/输出样例

输入格式

4

输出格式

15

C语言解答

#include <stdio.h>
#include <stdlib.h>
int main()
{
	unsigned long long a[100]={0},sum=0;
    int i,n;
    
    scanf("%d",&n);
    a[1]=1;
    for(i=2;i<=99;i++)
        a[i]=a[i-1]*2;
    for(i=1;i<=n;i++)
		sum+=a[i];
    if(n==64) printf("18446744073709551616");
    else printf("%lld",sum);
	return 0;
}

C++解答

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
	int n;
	cin >> n;
	if(n==64)
	cout << "18446744073709551616";
	else
	{
		unsigned long long sum=1;
		for(int i=1;i<=n;++i)
		sum*=2;
		cout << sum-1;
	}
	return 0;
}