任何一个正整数都可以用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)
输入格式:
一个正整数n(n≤20000)。
输出格式:
符合约定的n的0,2表示(在表示中不能有空格)
输入样例#1:
1315
输出样例#1:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
Thinking: 在今年上程序设计艺术选修课的时候,老师给我们展示过他写的代码,没想到在这遇到了。其实思路还是很简单的,我也是很水的,
#include<bits/stdc++.h>
using namespace std;
int n;
void solve(int n){
int k = log(n)/log(2); // 满足2^k <= n 的最大k,这样是不是比较简单
//对一个数 n 取 1+lg(n)可以得到这个数的位数。
if(n > 4){
printf("2(");
solve(k); // 对得到的 k 进行分解
printf(")");
if(n != pow(2, k)) // 如果 n 恰好能分解为2的k次幂,后面不用添加号
printf("+");
solve(n - pow(2, k)); // 对 n 取 k 次幂剩下的部分进行分解
}else{
if(n == 0) return ;
else if(n == 1) printf("2(0)");
else if(n == 2) printf("2");
else if(n == 3) printf("2+2(0)");
else if(n == 4) printf("2(2)");
}
}
int main(){
scanf("%d", &n);
solve(n);
return 0;
}