学ぶ/ヨセフの問題の最後の生存者を見つけるためのC ++のアルゴリズム

ゲームのルール:円の中のn個人は、他のを残したまま、この位置を殺すために、(これは別の質問とクラシックヨセフであることに注意してください!!)2に、最初の人からそれぞれ数をカウントを繰り返すようになりました人々。しかし、私は、これはヨセフを殺されたくありません。彼は最後の生存者の位置を決定し、そしてそこに立っていました。私たちは、位置番号がAである。生き残った人々を覚えて (実験から)

次のような手順は以下のとおりです。

#include <iostream>

using std::cout;
using std::endl;

//程序测试
int main()
{
    int num = 1111;             //最大数
    int base = (num+1)/2;       //所有数,且省去了第一次判断最大是否存活
    bool flag = true;           //判断最大数是否继续存在,即开始的位置是奇数还是偶数, 1代表奇数(存活), 0代表偶数(死亡).
    int sub = 1;                //最大数减去的基数
    while(base >= 2){           //直至所有数 >= 都要继续循环,直至找到最后的最大数,num存放的就是最大数
        sub *= 2;
        if(flag){
            if(base%2 != 0){
                num -= sub;
             	//此处代码省略
                base -= 1;
                base /= 2;
            }else{
                base /= 2;
            }
        }else{
            if(base%2 == 0){
                num -= sub;
                base /= 2;
            }else{
                base += 1;
                base /= 2;
                //此处代码省略
            }
        }
    }
    cout<<"最后活下来的数字是: "<<num<<endl;
}

この手順は、単に多くのコメント、最後の数字を取得し、問題を解決していませんが、アルゴリズムの学生が勉強できるような考え方は、ほとんど、そこに上記のコードの一部を省略しております...



公開された31元の記事 ウォンの賞賛3 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_36557960/article/details/78572878
おすすめ