题目描述
任何一个正整数都可以用2的幂次方表示。例如137=27+23+20。
同时约定方次用括号来表示,即a可表示为a(b)。
由此可知,137可表示为2(7)+2(3)+2(0)
进一步:
7 =22+2+ 20 ( 21用2表示),并且3=2+ 20。
所以最后137可表示为2(2(2)+2+2(0))+2(2+2(0))+2(O)。又如1315=210 +28+25+2+1
所以1315最后可表示为2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(O))+2+2(0)。
输入格式
—行一个正整数n。
输出格式
符合约定的n的0,2表示(在表示中不能有空格)。
输出范例:
输入:1315 输出:2(2(2+2(0))+2)+2(2(2+2(0)) )+2(2(2)+2(0))+2+2(0)
完全用的递归作答,想看懂的话自己在脑子里把范例的输出对照代码想一遍就好了。另外n==1那个判定不要删,虽然删了也可能过关,但那个判断可以适应输入的n==1的情况。
#include<iostream>
#include<string>
using namespace std;
void fun(int n, string& s)
{
if (n == 2) s += "2";
else if (n == 1) s += "2(0)";
else {
int i,t=1;
for (i = 1;; ++i) {
t *= 2;
if (t * 2 > n) break;
}
if (i == 1) s += "2";
else {
s += "2(";
fun(i, s);
s += ")";
}
if (n - t > 2) {
s+= "+";
fun(n - t, s);
}
else if (n-t == 2) s += "+2";
else if (n-t == 1) s += "+2(0)";
}
}
int main()
{
int n;
string s;
cin >> n;
fun(n,s);
cout << s;
return 0;
}