【题目描述】
任何一个正整数都可以用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)。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表示(在表示中不能有空格)。
【输入样例】
1315
【输出样例】
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
源代码: #include<cstdio> int n,i[15]; //数组好恶心。 void DFS(int t) //奇妙的递归。 { if (t/2==1) //处理2^1的情况。 { printf("2"); if (t-2) { printf("+"); DFS(t-2); } } else { printf("2("); int num=0; for (int a=0;a<=15;a++) if (i[a]>t) { num=a-1; break; } if (num>2) { DFS(num); printf(")"); //这一块的处理已经结束。 } else printf("%d)",num); //这一点的处理已经结束。 if (t-i[num]) { printf("+"); DFS(t-i[num]); } } } int main() { scanf("%d",&n); i[0]=1; for (int a=1;a<=15;a++) //构建2次方查询表。 i[a]=i[a-1]*2; DFS(n); return 0; }