题解 P1010 【幂次方】
Morning_Glory
2018-06-10 21:58:21
## 看这题题解总是要对0,1进行特判,其实也可以不用特判,也不用把输出存到一个数组里面,直接输出也可以的
这道题就是要将一个数字分解成2^x+2^y……但是之间又有一些细节不得不注意
1 每次输出前总是要判断前面要不要个'+'
2 每次输出前要记得带括号
3 2^1要输出2
4 输出2前有没有括号
对于每次要不要带着'+'输出这个问题呢,其实不难发现,在')'或者单个2后要输出'+'
所以用一个bool型来判断要不要输出'+'就好了
贴上代码
```cpp
#include <iostream>
#include <cstring>
using namespace std;
bool k;//记录输出前要不要带'+'
int in;
void swap(int &a,int &b)
{
int t=a;
a=b;
b=t;
}
void des(int n)
{
int num=-1,m[20];
memset(m,0,sizeof(m));//每次都将m数组清零,其实也可以不清
while (n>0){
m[++num]=n%2;//将各个位记录下来(二进制表示)
n/=2;
}
for (int i=num;i>=0;i--){
if (m[i]&&i!=1){//首先这个位必须是我们要输出的,然后如果是2^1得输出普通的2
if (k)cout<<'+';//需要输出'+'得放在下面的前面
cout<<2;//除了单个2以外每个都是2的次方
cout<<'(';
k=0;//在'('后的下一个没有'+'
if (i)des(i);//如果不是2的0次方,就再次处理该位上的输出//毕竟是从大到小输出
else cout<<0;//0就没必要再进去一次了
cout<<')';k=1;//')'后的数都是带'+'的
}
else if (m[i]){
if(k)cout<<"+";
cout<<2;
k=1;//同样,单个2后面也是要'+'的
}
}
}
int main ()
{
cin>>in;
des(in);
return 0;
}
```