题目描述
这是个著名的数学问题,原题是:一筐西瓜,三个人分,第一个人拿走全部的一半又再多拿走一个,第二个人拿走剩下的一半又再拿走一个,第三个人拿走剩下的一半又再拿走一个。刚好分完,问这筐西瓜有几个?
我认为博学多才的你一定知道这个问题的计算方法。我是计算机老师,当然想让你用计算机解决更在数据范围的问题。现在的问题是: 一筐西瓜,N个人分,第一个人拿走全部的一半又1个,第二个人拿走剩下的一半又1个,第三个人拿走剩下的一半又1个,如此下去,第N个人也如此,则西瓜刚好分完,问这筐西瓜有几个?
输入格式
第一行1个整数n,范围在[1,15]。
输出格式
只一个整数,这筐西瓜的总数。
样例输入/输出
输入数据 1
2
输出数据 1
6
数据规模与提示
时间限制:1000ms.
内存限制:256MB.
题解:
这道题的思路和原题类似,只是要根据题目中的描述修改一下算法。
我们可以使用一个变量sum来表示筐中西瓜的数量,初始值为0。然后,我们从第一个人到第N个人依次循环,每次将sum加1,然后乘以2。
最后,输出sum的值即可。
C++代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n,sum=0;
cin>>n;
for(int i=1;i<=n;i++)
{
sum++;
sum*=2;
}
cout<<sum;
return 0;
}
时间复杂度分析:
该算法的时间复杂度为O(n),其中n为人数。因为循环的次数与n线性相关。
空间复杂度分析:
该算法的空间复杂度为O(1),只需要使用一个sum变量来保存筐中西瓜的数量。