2的N次方
法一:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N=50; 5 6 int main(){ 7 //首先暴力来一遍??? 8 int v,ans[N]; 9 cin>>v; 10 memset(ans,0,sizeof(ans)); 11 //将40作为最低位 12 ans[0]=ans[1]=1; 13 //核心算法 14 while(v-->0){ 15 for(int i=1;i<=ans[0];i++){ 16 ans[i]*=2; 17 } 18 //整理结果 19 for(int i=1;i<=ans[0];i++){ 20 ans[i+1]+=ans[i]/10; 21 ans[i]%=10; 22 } 23 if(ans[ans[0]+1]>0)ans[0]++; 24 } 25 26 for(int i=ans[0];i>0;i--){ 27 cout<<ans[i]; 28 } 29 return 0; 30 }
法二:
优化点:
当中间结果的第一位的数值达到一定量级(如1e8)时,再进行进位处理。
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N=50; 5 6 void carry(int ans[]){ 7 for(int i=1;i<=ans[0];i++){ 8 ans[i+1]+=ans[i]/10; 9 ans[i]%=10; 10 if(ans[ans[0]+1]>0){ 11 ans[0]++; 12 } 13 } 14 } 15 int main(){ 16 int v,ans[N]; 17 cin>>v; 18 memset(ans,0,sizeof(ans)); 19 //将40作为最低位 20 ans[0]=ans[1]=1; 21 //核心算法 22 while(v-->0){ 23 for(int i=1;i<=ans[0];i++){ 24 ans[i]*=2; 25 } 26 //整理结果 27 if(ans[1]>1e8){ 28 carry(ans); 29 } 30 } 31 //最后进位一次 32 carry(ans); 33 //输出结果 34 for(int i=ans[0];i>0;i--){ 35 cout<<ans[i]; 36 } 37 return 0; 38 }