004: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复赛 普及组 第一题
#include <iostream>
using namespace std;
int a[15];
void count2(){//将20000以前2的n次方提前计算出来
int b=1;
a[0]=b;
int i=1;
while(b<20000){
b*=2;
a[i]=b;
i++;
}
}
int expressTwo(int n){
int exp[15];//记录当前数的2的幂次的集合
int count=0;
for(int i=0;i<15;i++){//初始化为-1,方便判断
exp[i]=-1;
}
int j=14;
while(n!=0){//如果当前数字比2的幂次大,则记录当前2的幂次,然后减掉2的幂次,继续比较直到当前数字为0
if(n>=a[j]){
exp[count]=j;
count++;
n-=a[j];
}
j--;
}
int m=0;
while(exp[m]!=-1){//依次处理当前数的2的幂次的集合
if(exp[m]==1){//如果是1的话直接输出2
cout<<"2";
}else{//不是的话,如果是0则不需要继续递归
cout<<"2(";
if(exp[m]==0) cout<<"0";
else expressTwo(exp[m]);
cout<<")";
}
if(m!=count-1) cout<<"+";//不是最后一个数,则需要+
m++;
}
}
int main(){
count2();
int n;
cin>>n;
expressTwo(n);
}