递归分解二进制

  • ①n=0 ②n=1 ③n>=2 :需要递归分解

注意:

  • 当n=1时,输出2(0)
  • 递归调用时:若分解出的指数为1,对应字符串是2,而不是2(2(0))
#include<iostream>
#include<string>
using namespace std;

string two(int a){
    string s;
    if(a==0)s="0";//递归出口
    else if(a==1)s="2(0)";

    else{
      int m[20];//记录分解后对应2的指数
      int powx=0,sum=0;//指数、分解个数
      while(a!=0){
        if(a%2==1)m[sum++]=powx;
        a=a/2;
        powx++;
      }
      
      if(m[sum-1]!=1)s="2(" + two(m[sum-1]) + ")" ;//当指数为1时,是2,而不是2(2(0))
      else s="2" ;//
      
      if(sum>1){//分解个数不止一个
        for(int i=sum-2;i>=0;i--){
          if(m[i]!=1)s=s+"+"+"2("+two(m[i])+")";//同上
          else s=s+"+"+"2";
        }
      }
    }
    return s;
}

int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        cout<<two(n)<<endl;
    }
    return 0;
}