题目描述
任何一个正整数都可以用 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)
解题思路
本题原理在于把一个数一直分解成2的n1次方的n2次方的……(直到出现2的1次方和2的0次方)相加的形式
递归就出现了
递归式
f(x) = {x == 1 cout << "2(0)";
{x == 2 cout << "2";
{x == 3 cout << "2(0) + 2";
{x >= 3 cout << "2(" ;
f(n)(n是<=x的2的幂) ;
cout << ")";
if(x - n > 0) cout << "+";
f(x - n);
代码实现
不需要返回任何东西,所以用void,递归式如上
void f(int x) {
if (x == 1) cout << "2(0)";
if (x == 2) cout << "2";
if (x == 3) cout << "2+2(0)";
if (x > 3) {
cout << "2(";
int i = 15;//2^15 = 32,768 超出取值范围,可以使用
while (pow(2, i) > x)i--;//求出n的值
f(i);
cout << ")";
if (x - pow(2 , i) > 0) {
cout << "+";
f(x - pow(2, i));
}
}
}
完整代码
#include<bits/stdc++.h>
using namespace std;
void f(int x) {
if (x == 1) cout << "2(0)";
if (x == 2) cout << "2";
if (x == 3) cout << "2+2(0)";
if (x > 3) {
cout << "2(";
int i = 15;//2^15 = 32,768 超出取值范围,可以使用
while (pow(2, i) > x)i--;
f(i);
cout << ")";
if (x - pow(2 , i) > 0) {
cout << "+";
f(x - pow(2, i));
}
}
}
int main() {
int n;
cin >> n;
f(n);
return 0;
}
bye~~