洛谷 P1010 幂次方 Label:模拟

题目描述

任何一个正整数都可以用2的幂次方表示。例如

    137=2^7+2^3+2^0         

同时约定方次用括号来表示,即a^b 可表示为a(b)。

由此可知,137可表示为:

    2(7)+2(3)+2(0)

进一步:7= 2^2+2+2^0 (2^1用2表示)

    3=2+2^0   

所以最后137可表示为:

    2(2(2)+2+2(0))+2(2+2(0))+2(0)

又如:

    1315=2^10 +2^8 +2^5 +2+1

所以1315最后可表示为:

    2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

输入输出格式

输入格式:

一个正整数n(n≤20000)。

输出格式:

符合约定的n的0,2表示(在表示中不能有空格)

输入输出样例

输入样例#1:
1315
输出样例#1:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #define inf 0x3f3f3f3f
 7 #define ll long long
 8 using namespace std;
 9 int n;
10 void trans(int i){
11     if(i==14) cout<<"2(2(2+2(0))+2(2)+2)";
12     if(i==13) cout<<"2(2(2+2(0))+2(2)+2(0))";
13     if(i==12) cout<<"2(2(2+2(0))+2(2))";
14     if(i==11) cout<<"2(2(2+2(0))+2+2(0))";
15     if(i==10) cout<<"2(2(2+2(0))+2)";
16     if(i==9)  cout<<"2(2(2+2(0))+2(0))";
17     if(i==8)  cout<<"2(2(2+2(0)))";
18     if(i==7)  cout<<"2(2(2)+2+2(0))";
19     if(i==6)  cout<<"2(2(2)+2)";
20     if(i==5)  cout<<"2(2(2)+2(0))";
21     if(i==4)  cout<<"2(2(2))";
22     if(i==3)  cout<<"2(2+2(0))";
23     if(i==2)  cout<<"2(2)";
24     if(i==1)  cout<<"2";
25     if(i==0)  cout<<"2(0)";
26 }
27 int main(){
28     cin>>n;
29     while(n>0){
30         for(int i=14;i>=0;i--){
31             int k=pow(2,i);
32             if(k<=n){
33                 trans(i);
34                 n-=k;
35                 if(n>0) cout<<'+';
36                 break;
37             }
38         }
39     }
40     return 0;
41 }

2^14=16384

2^15=32768

我这应该不算打表吧?

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
原文地址:https://www.cnblogs.com/radiumlrb/p/5811186.html