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 }

 

posted @ 2021-07-31 21:42  Rekord  阅读(165)  评论(0编辑  收藏  举报