问题描述
任何一个正整数都可以用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)
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表示(在表示中不能有空格)
代码如下:
#include<iostream> #include<algorithm> #include<string> #include<map> #include<vector> using namespace std; string CHANGE(int n) { if (n == 0)return "0"; string s; vector<int>k; int t = n,sum; while (t!=0) { n = t; sum = 0; while (t!=1) { sum++; t = t / 2; } k.push_back(sum); t = n - pow(2, k[k.size() - 1]); } for (int i = 0; i < k.size(); i++) { if (i != 0) s = s + "+"; if (k[i] == 1) s = s + "2"; else s = s + "2(" + CHANGE(k[i]) + ")"; } return s; } int main() { int N; cin >> N; cout << CHANGE(N) << endl; return 0; }