ブルーブリッジカップのトレーニングアルゴリズムは、2つの力を表し

:タイトルの最近のブラシブルーブリッジカップの公式サイトではブロガーは、興味深いアルゴリズムの問題見つけ
、次のようにクラスのコンテンツのタイトルを:

問題の説明
  は任意の正の整数は、例えば、バイナリ形式で表すことができる:137 10001001バイナリとして表されます。
  これは、形式で書かれ、2のバイナリ電力を表すので、高出力の上部表面は、以下の式を与えること:137 = 2 7 + 2 3 + 2 ^ 0
  今ブラケットの力と一致彼は、^ bは(b)のように表現されることを示し
  2(7)+ 2(3)+ 2(0):この場合、137は以下のように表すことができる
  さらに:7 = 2 2 + 2 + 2 0(2 ^ 1 2)を表す
  ^ 2 = 0 3 + 2
  2(2(2)+ 2 + 2(0))2 +(2 + 2(0))2 +(0)ので、最終的に137のように表すことができる。
  別の例:1315 2 = 10 + 2 ^ 5 8 + 2 + 2 + 1
  には、最終的な1315のように表すことができる。
  2(2(2 + 2(0))+ 2)+ 2(2(2 + 2(0)))+ 2 (2(2)+ 2(0))+ 2 + 2(0)
入力形式
  の正の整数(1 <= N <= 20000 )
出力形式
  N -conformingは0,2(表現にはスペース)を表していません
入力サンプル
137
の出力例
2(2(2)+ 2 + 2(0))2 +(2 + 2(0))2 +(0)
サンプル入力
1315
サンプル出力
2(2(2 + 2(0))+ 2)+2(2(2 + 2(0)))+ 2(2(2)+2(0))+ 2 + 2(0)

それの効果の対象には......まあ、量を実装するために、質問は非常に簡単に理解することです、そうです
、私はこれをしなかったすべての権利を、私はこの質問、それが最初に考えた上で始めるためのアイデアについて話します徐々に(〜%混乱の線にかき混ぜるネストされたループがあり、プラス裁判官場合がありますが、良い習慣が、これは反対休憩に等しいことがわかりますしたい、あなたの考えは、ネストされたのこれらの層になります?? ...、#*「☆ &℃$ ︿★)
以降の問題を解決するために、バイナリビット演算を使用するように、最近で結合されたスマートブロガーが、勉強:
私はこの質問の目的を達成するために、再帰的な方法の私の考えを変えました。

まあ実際には再帰再帰ルーチン(テンプレートの同じ年)がある:
1、最初の考慮事項は、再帰的な輸出(と最高の思考)である:
多分私達は再帰関数nの数を取得する場合、我々は確かに考えることができる思考について= 10は、
第一(ブロガーにバイナリ変換方法は、前記事アバディーンの変換処理ではない、あまりにもここで説明)バイナリ形式に変換され、
1010 10 =「(バイナリ)
1010と2 ^ 3 + 2 + 0として理解することができます^ 1 + 0
----------------------------- 1-0。3 ------ ----- 2は
しません我々は、このロジックを考えていませんでした法律が最初から三番目に高い最後の最後まで0点であることが判明知っている
右ここで、0は再帰的な輸出であり、
私たちのプログラムは持っていること:
ここに画像を挿入説明
我々は、n == 0であるとき、関数から
図2に示すように、次のステップは、少し難しいステップを理解することである:
我々がINT内のすべての既知のC ++のコンピュータに格納されているように、次いで32(4×8)ビット整数ゼロである4バイトであります00000000000000000000000000000000 32が正および負の相関の最も高いシンボルである表現の署名されたタイプであるので、ゼロである
I Nは、最上位ビットを取得したいことは、使用のビット演算子には、いくつかのみ必要の最初のものである
、我々は最初のビット演算と(&)のint nにすることを1 << 31、最高31へ移動
= 0 10000000000000000000000000000000 00000000000000000000000000001010&
...... ......
...... ... ...
第三の場所1 << 3に移動するまで、
00000000000000000000000000001000&00000000000000000000000000001010 = 1
、我々は第三の最上位ビット10を取得し、我々は、それ自体が再びネストされた関数を呼び出す必要がありますので、それは> 2 3ので、2(3)のように表すことができます。図3は、関数に渡されます。

............順次Nまで== 0、関数空間(溶液)の内部機能スタック1つのレベル移動:
ここに画像を挿入説明
3、そして最後に+記号のような問題の数を決定されることに留意すべき我々は8 =「(バイナリなら)1000は、今や最高レベルのポイントは、私たちJ = 3それでは、どのように+記号をバックに追加するかどうかを判断するんです。
ここにあなたが独創的な方法または完全にビット演算で使用することができます
左に移動するために、我々は完全な位置を取る(バイナリ)1000彼はまた、参照してくださいする必要があり背面の数までのビットによって、同じビットで実行される場合と、それの+
65535(バイナリ)1111111111111111(16ワン)が残っていた(16-J)ビットの
その65535 >>(16-3)=そう0000000000001111
0000000000000111&1000年= 0、falseの+を追加することなく、その背後にあるすべてのゼロを言う
か、増加傾向に
ここに画像を挿入説明

ソースコード全体:

#include <iostream>
using namespace std;
void change(int n){
    if(n == 0){
        cout << 0;return;
    }
    else{
        int i = sizeof(int)*8 - 1;
        while(!(n&(1<<i))){
            i--;
        }
        for(int j = i;j>=0;j--){
            if(n&(1<<j)){
                if(j == 1){
                    cout << "2";
                }
                else{
                    cout << "2" << "(";
                    change(j);
                    cout << ")";
                }
                if(n&(65535>>(16-j))){
                    cout << "+";
                }
            }
        }
    }
}

int main(){
    int n;
    cin >> n;
    change(n);
}
公開された27元の記事 ウォン称賛62 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_42359956/article/details/87704205