题解 P1010 【幂次方】

Morning_Glory

2018-06-10 21:58:21

Solution

## 看这题题解总是要对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; } ```