递归--练习9--noi8758 2的幂次方表示

时间:2022-05-17 23:36:38

递归--练习9--noi8758 2的幂次方表示

一、心得

找准子问题就好

二、题目

8758:2的幂次方表示

总时间限制: 
1000ms

内存限制: 
65536kB
描述

任何一个正整数都可以用2的幂次方表示。例如:

137=27+23+20

同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:

2(7)+2(3)+2(0)

进一步:7=22+2+20(21用2表示)

3=2+20

所以最后137可表示为:

2(2(2)+2+2(0))+2(2+2(0))+2(0)

又如:

1315=210+28+25+2+1

所以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表示(在表示中不能有空格)。
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
来源
NOIP1998复赛 普及组 第一题

三、AC代码

 /*
noi8758 2的幂次方表示 找准子问题就好
*/
#include <iostream>
#define Max 21
using namespace std;
//将一个数转化为2进制
void to2(int n,int (&a)[Max]){
int i=;
while(n!=){
a[i++]=n%;
n/=;
}
}
//打印数组
void printArray(int a[],int n){
for(int i=;i<=n;i++){
cout<<a[i]<<" ";
if((i+)%==){
cout<<endl;
}
}
cout<<endl;
}
//递归操作
void f(int n){
int a[Max]={};
to2(n,a);
//printArray(a,20);
int first=; for(int i=Max;i>=;i--){
if(a[i]==){
if(first){
cout<<"2(";
f(i);
cout<<")";
first=;
}
else{
cout<<"+2(";
f(i);
cout<<")";
}
} } if(==a[]){
if(first){
cout<<"2(2)";
first=;
}
else{
cout<<"+2(2)";
}
}
if(==a[]){
if(first){
cout<<"";
first=;
}
else{
cout<<"+2";
}
}
if(==a[]){
if(first){
cout<<"2(0)";
first=;
}
else{
cout<<"+2(0)";
}
}
}
int main(){
int n;
cin>>n;
f(n);
cout<<endl;
return ;
}