1115: 幂次方(New Online Judge)
题目描述
任何一个正整数可以用2的幂次方表示。例如137 = 27+23+20。同时约定次方用括号表示,即 a b a^b ab可表示为 a ( b ) a(b) a(b)。由此可知137可以表示成2(7)+2(3)+2(0)。同理,数字7,3还可以继续这样表示下去。最终137=2(2(2)+2+2(0))+2(2+2(0))+2(0)
输入
输入存在多组测试数据,每组测试数据输入一行包含一个正整数表示n(n<=20000)
输出
对于每组测试数据输出一行表示答案。
样例输入
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(C++版本)
#include<bits/stdc++.h>
using namespace std;
int n;
void dfs(int n){
if(n == 1){
printf("2(0)");
return ;
}
int i;
for(i = 20; i >= 0; i--){ //由于n<=20000,而2^20 > 20000,最多枚举20位
if(n&(1<<i)) break;
}
if(i != 1){ //递归打印2的i次幂的结果
printf("2(");
dfs(i);
printf(")");
}else {
printf("2");
}
n -= (1<<i);
if(n){
printf("+");
dfs(n);
}
}
int main(){
while(~scanf("%d", &n)){
dfs(n);
printf("\n");
}
return 0;
}