题解 | 2的幂次方
#include <bits/stdc++.h> using namespace std; string toBinary(int n){ string a=""; while(n!=0){ a+=n%2+'0'; n/=2; } return a; } string transN(int n){ if(n==0) return "0"; if(n==1) return "2(0)"; if(n==2) return "2"; string s=toBinary(n); string t=""; for(int i=s.size()-1;i>=0;i--){ if(s[i]=='1'){ if(i==1)t=t+"2+"; else t=t+"2("+transN(i)+")+"; } } t.pop_back(); return t; } int main(){ int n; while(cin>>n){ cout<<transN(n)<<endl; } }
这里提供一个带函数的,上一个不太清晰,这里解释一下这个递归函数
tranN( x ) = 2( tranN( n1 ) ) + 2( tranN( n2 ) ) + 2( tranN( n3 ) ) + ...
这个就是递归函数,也就是说,这个函数的生成结果是一个字符串,字符串中的内容如果不是2(0) 2 2(2)就要重新调用一个相同的函数,那么,这个递归方程和结束条件就清晰了,这样,我们如果获取到这个二进制字符串,对应的n1,n2... 就是对应位的序号,然后可以按照我的写法,也可以按照自己的想法来,只需要进行一个判断就可以很容易的写出来,甚至可以不用加上结束判断,感兴趣的小伙伴可以优化一下这个代码