1-F 2的幂次方表示

描述

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

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

同时约定方次用括号来表示,即ab可表示为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
137

样例输出

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

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <cmath>

using namespace std;

int max(int num){
int i;
for (i = 15; i >= 0; i --) {
if (int(pow(2, i) + 0.5) <= num) {
return i;
}
}
return 0;
}

int main(void){
char map[16][30] = {"(0)", "", "(2)", "(2+2(0))", "(2(2))", "(2(2)+2(0))", "(2(2)+2)", "(2(2)+2+2(0))",
"(2(2+2(0)))", "(2(2+2(0))+2(0))", "(2(2+2(0))+2)", "(2(2+2(0))+2+2(0))", "(2(2+2(0))+2(2))",
"(2(2+2(0))+2(2)+2(0))", "(2(2+2(0))+2(2)+2)","(2(2+2(0))+2(2)+2(2)+2+2(0)))"};
int num;
cin >> num;
int n = max(num);
for(int i = n; i >= 0; i--){
int diff = num - (int)(pow(2, i) + 0.5);
if(diff > 0){
cout << "2" << map[i] << "+";
num = diff;
}
else if(diff == 0){
cout << "2" << map[i] << endl;
break;
}
}
return 0;
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×