1. 程式人生 > >C語言經典演算法100例-069-簡單約瑟夫環問題

C語言經典演算法100例-069-簡單約瑟夫環問題

這裡我們實現一個簡單的約瑟夫環問題,描述如下:

有N個人站成一圈,從第一個人開始報數,從1報到3,報到3的那個人走出圈,然後從下一個人開始從1繼續報數,重複上面的過程,直到最後圈裡只剩下一個人,問這個人是哪個人?

分析:首先,我們要給這N個人編號,分別編為1到N,

然後,開始報數,同時記錄 當前編號,所報數,圈內人數,

只要圈內人數大於1,就一直重複,

報數過程中,如果所報數為3,那麼要做這幾件事:1,將這個人踢出圈 2,圈內人數減一 3,重置所報數。

具體實現起來如程式碼所示:

//n 個人,報數,去3,剩下幾號-簡單約瑟夫環問題
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 20

int main()
{
    int Ring[MAX_SIZE];
    int i, n;
    int cnt;    //代表報的數
    int pos;    //當前位置數
    int num;    //當前環中的人數
    int *p = Ring;    //用指標訪問陣列

    //輸入環中的初始人數
    printf("input the n.\n");
    scanf("%d", &n);

    //輸入一些元素
    for (i = 0; i < n; i++)
        *(p+i) = i+1;

    //報數 去3
    num = n;
    pos = 0;
    cnt = 0;
    
    while (num != 1)    //一直報到剩下一個人
    {
        if(*(p + pos) != 0) ++cnt;  //對當前元素報數
        if (cnt == 3)       //報到3了
        {
            *(p + pos) = 0;         //踢出環
            --num;          //環大小-1
            cnt = 0;        //重置報的數
        }
        ++pos;                //指向下一個元素
        if(pos == n)        //到環尾則返回環頭
            pos = 0;
    }
    while (*p == 0) p++;    //找到最後剩下的那個元素
    printf("%d is left",*p);

    return 0;

}
這裡用陣列表示約瑟夫環,陣列內元素置0表示不在環內,當位置累積到N時置0來實現“環”結構。