ブルーブリッジカップ2のべき乗はC++アルゴリズムがHERODINGのブルーブリッジカップの道を訓練することを表します


リソース制限時間制限:1.0 sメモリ制限:512.0 MBの問題は、いずれの正の整数も2進数で表すことができることを示しています.たとえば、137の2進数は1000101で表されます.このような2進数表現を2の2乗の和として書く形で、2乗の高さを前面に並べると、137=27+23+2^0となる.137は、2(7)+2(3)+2(0)さらに、7=22+2+20(2^1は2で表される)3=2+2^0であるので、最後の137は、2(2(2)+2+2(0))+2(2+2(0))+2(0)また、1315=210+28+2^5+2+1であるので、1315は、最後に、2(2(2+2(0)+2)+2(2(2+2(0)))+2(2(2(2(2)))+2(2(2(2)+2(0)))+2(2(2)+2(0))+2+2(0)入力フォーマット正整数(1<=n<=20000)出力フォーマットが所定のnの0に合致し、2は(表示にスペースがない)サンプル入力137サンプル出力2(2(2)+2+2(0))+2(2+2(0))+2(2+2(0))+2(0)サンプル入力1315サンプル出力2(2(2+2(0))+2)+2(2(2(0)))))+2(2(2(2(2)+2(0)))))+2(2(2(2(2)+2(0))))+2(0)提示用再帰実装が比較的簡単であることを示す.再帰しながら出力できる
問題を解く構想:ここ数日簡単な問題に慣れてしまって、一見この問題はまだ適応していない.実はこれも比較的基礎的な再帰アルゴリズムの問題で、ただこの再帰は2層に分けて行われているだけだ.≪第1レベル|First Layer|emdw≫:再帰のたびに現在のビット数とセカンダリべき乗数が格納されます.第2層:次べき乗数を再帰し、再び2で表される形式に分解し、条件が満たされていない場合は、すべての数字が2または0になるまで再帰します.コードは次のとおりです.
#include
 
using namespace std;
 
void put(int num,int n){//num    ,n     
    if(num == 0) return;//    ,     
    int r=num % 2;//        
    num=num / 2;//     
    put(num, n + 1);//      +1 
    if(num && r){//       0     '+'  
		cout << "+";
	}
    if(r){ //        0           
        if(n == 1)
            cout << "2";
        else{
            cout << "2(";
            if (n == 0){
            	cout << "0";
			}
            else put(n, 0);//      2  ,     
           cout << ")";
        }
    }
}
int main(){
    int num;
    cin >> num;
    put(num, 0);//          0   
    return 0;
}


このお兄さんの分かち合いに感謝します.https://www.cnblogs.com/gongpixin/p/4477355.html