题目描述
任何一个正整数都可以用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=2^10 +2^8 +2^5 +2+2^0 所以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<bits/stdc++.h>
using namespace std;
void f(int n) {
int a[30],cn=0;
while(n) {
a[cn++]=n%2;
n=n/2;
}
bool sign=false;
for(int i=cn-1; i>=0; i--) {
if(a[i]==1) {
if(sign) {
cout<<"+";
}
if(i==0) {
cout<<"2(0)";
} else if(i==1) {
cout<<"2";
} else if(i>=2) {
cout<<"2(";
f(i);
cout<<")";
}
sign=true;
}
}
}
int main() {
int n;
cin>>n;
f(n);
return 0;
}
递归解法二:
#include<bits/stdc++.h>
using namespace std;
int f(int n) {
int a[25];
int l = 0;
while (n>0) {
a[l++]=n%2;
n=n/2;
}
bool fl=true;
for (int i=l-1; i>=0; i--) {
if (a[i]==1) {
if (fl)
fl = false;
else
putchar('+');
if (i==1)
printf("2");
else if (i==0)
printf("2(0)");
else if (i>=2) {
printf("2(");
f(i);
printf(")");
}
}
}
}
int main() {
int n;
scanf("%d", &n);
f(n);
return 0;
}
打表解法:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
while(n!=0) {
int i=0;
while(i<=14) {
if(pow(2,i)<=n&&pow(2,i+1)>n) {
n=n-pow(2,i);
if (i==0) cout<<"2(0)";
if (i==1) cout<<"2";
if (i==2) cout<<"2(2)";
if (i==3) cout<<"2(2+2(0))";
if (i==4) cout<<"2(2(2))";
if (i==5) cout<<"2(2(2)+2(0))";
if (i==6) cout<<"2(2(2)+2)";
if (i==7) cout<<"2(2(2)+2+2(0))";
if (i==8) cout<<"2(2(2+2(0)))";
if (i==9) cout<<"2(2(2+2(0))+2(0))";
if (i==10) cout<<"2(2(2+2(0))+2)";
if (i==11) cout<<"2(2(2+2(0))+2+2(0))";
if (i==12) cout<<"2(2(2+2(0))+2(2))";
if (i==13) cout<<"2(2(2+2(0))+2(2)+1)";
if (i==14) cout<<"2(2(2+2(0))+2(2)+2)";
if (n!=0) cout<<"+";
break;
}
i=i+1;
}
}
return 0;
}