1. 程式人生 > >約瑟夫環問題(一)(難度:1顆星)

約瑟夫環問題(一)(難度:1顆星)

問題描述:

編號為1,2,…,n的n個人按順時針方向圍坐一圈,任選一個正整數作為報數上限m,從第一個人開始按順時針方向從自1開始順序報數,報道m時停止報數.報m的人出列,從他的順時針方向上的下一個人開始重新從1報數,如此下去,直至所有人全部出列為止,設計一個程式求出出列順序.

輸入輸出描述:

m和n由使用者輸入,並且保證m和n的範圍是【1,1000】,輸出出列序列。

問題分析:

因為這個是要求出所有的出列序列,所以目前還沒想到效率更高的方法,只能用模擬法,時間複雜度是O(m*n),設定三個變數:

index:表示目前所執行的人的號碼
count:表示目前報的數是多少
OutPeopleCount:表示目前出列的人數

如果是要求出最後一個出列人的標號,請參考我的另外一篇文章:
http://blog.csdn.net/yi_ming_he/article/details/72860011

參考程式碼:

#include <stdio.h>
#include <string.h>
#include <malloc.h>

int main()
{
    int n, m, nIndex = 0, nCount = 1, nOutPeople = 0;
    scanf_s("%d%d", &n, &m);
    char *pIsOut = (char*)malloc
(n * sizeof(char)); memset(pIsOut, 0, sizeof(char)* n); while (1) { if (1 == pIsOut[nIndex])//已經out了 { nIndex = (nIndex + 1) % n; continue; } if (nCount % m == 0) { pIsOut[nIndex] = 1; nOutPeople++; printf
("%d\n", nIndex + 1); } if (nOutPeople == n) break; nIndex = (nIndex + 1) % n; nCount++; } free(pIsOut); return 0; }

執行結果:

這裡寫圖片描述