解题思路:
1.Long long最高表示2的63次的整数,此题n最大为100,所以存放不下,需要用到高精度乘法,并且用数组来模拟
2.首先判断n最大为100,依照十进制数的规律,数组不需要开多大100即可,int a[105];用来存放积
3.如果n为0的话,直接输出1即可,如果n大于0,则开始累乘,所以可以设置数字a[1]=1,用a[1]去乘 2,乘法不同的是,数组中的每一位都要去乘2,并且加上前一位的进位,所以要对每一位进行进位处理,并且在进行完一轮乘2后,如果最高位上还是大于等于10的,那么扩充数组长度+1,这一位上存储进位,继续下一轮,下一轮开始之前进位归零,因为最低位上是不加进位的,相当于加的就是0;
4.利用打标记的方法去除前导0 ,从最高位输出结果
#include<bits/stdc++.h>
using namespace std;
int a[105];
int main()
{
int n,k=1;
cin>>n;
a[1]=1;//数组初始化为1
for(int i=1;i<=n;i++)
{
int jin=0;//每一轮的进位初始化为0,因为最低位是没有进位的,所以第一位总是加的0
for(int j=1;j<=k;j++)
{
a[j]=a[j]*2+jin;//分别对每一位上的数组元素值都乘2,并且加上前一位的进位
jin=a[j]/10;//进位等于本位上的除以10的商
a[j]=a[j]%10;//本位上对10取模
}
if(jin>0)//因为之前对数组的每一位都进行进位处理了 进位最大就是1
{
k++;//扩充数组
a[k]=1;//在最高位上放1
}
}
bool flag=0;
for(int i=105;i>=1;i--)//去除前导0
{
if(a[i]!=0)
flag=1;
if(flag==1)
cout<<a[i];
}
return 0;
}