原题点 这里
这是一道简单的分治题,其分治的思路为:
- 要输出 n 的二进制结果,先提取小于 n 的、最大的 2^m,输出 2^m 的二进制表示,再输出 n-2^m 的二进制表示。
- 要求 m,可以直接找到 n 的高位 1,它的位数减一即为 m 。
- 递归边界为 m 为 0 或 1,此时直接输出答案。
- 注意如果 n-2^m 为 0,就不用输出了,若不是要先输出 “+” 再继续递归。
代码:
#include <cstdio>
using namespace std;
// 返回小于等于 n 的最大的 2^x 的那个 x
int high_bit(int n){
int exp=20;
while(exp>=0){
int flag= 1<<exp;
if(flag&n) return exp;
--exp;
}
return -1; // n 是 0 的情况
}
void solve(int num){
int exp= high_bit(num), rest= num^(1<<exp); // num^(1<<exp) 等价于 num-(1<<exp)
if(exp==0){ printf("2(0)"); }
else if(exp==1){ printf("2"); }
else{
printf("2(");
solve(exp);
printf(")");
}
if(rest!=0){
printf("+");
solve(rest);
}
}
int main(){
int input; scanf("%d", &input);
solve(input);
putchar('\n');
return 0;
}