約瑟夫環問題(一)(難度:1顆星)
阿新 • • 發佈:2018-12-21
問題描述:
編號為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;
}
執行結果: