【問題描述】
約瑟夫問題:n個人圍成一圈,從第一個人開始報數,數到m的人出圈;再由下一個人開始報數,數到m的人出圈;…輸出依次出圈的人的編號。n,m由鍵盤輸入。
【程序代碼】
#include<iostream>
using namespace std;
int a[100];
int main()
{
int n,m;
cin>>n>>m; //n個人,報到m出圈
int pos=0,sum=0,out=0; //pos:每個人最初的序號,sum:保存計數,out:出圈人數
for(;out!=n;) {
pos++;
if(pos==n+1) pos=1;
if (a[pos]==0) ++sum; //第pos個位置上有人則報數
if (sum==m) { //當前報的數是m
sum=0; //計數器清零
cout<<pos<<" "; //輸出出圈人的編號
a[pos]=1; //此處的人已出圈,設置爲空
out++; //出圈的人數增加一個
}
}
return 0;
}
/*
in:
10 3
out:
3 6 9 2 7 1 8 5 10 4
*/