试题 算法训练 2的次幂表示
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。
将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=27+23+2^0
现在约定幂次用括号来表示,即a^b表示为a(b)
此时,137可表示为:2(7)+2(3)+2(0)
进一步:7=22+2+20 (2^1用2表示)
3=2+2^0
所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:1315=210+28+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的0,2表示(在表示中不能有空格)
样例输入
样例一:
137
样例二:
1315
样例输出
样例一:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
样例二:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
数据规模与约定
1<=n<=20000
代码
#include <stdio.h>
int nums[15] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384};
void f(int n) {
if(n == 1) { // n为1特殊情况只输出2(0)即可
printf("2(0)");
return;
}
int i;
for(i = 14;i >= 0; --i)
if(nums[i] <= n) break;
printf("2"); // 先输出2
if(i != 1) { // 若i为1说明不需要递归以及添加括号
printf("("); // 先添加左括号
f(i); // 对2的幂递归
printf(")");
}
if(n - nums[i]) { // 若还有剩余则需要对剩下的数字递归
printf("+"); // 先添加+号
f(n - nums[i]); // 然后递归
}
}
int main() {
int n;
scanf("%d", &n);
f(n);
return 0;
}