約瑟夫環是一個比較有趣的遊戲。玩法很簡單:一開始每人會有一個序號,並給出一個數字m;然後從第一個人開始報數,報到數字m的就離開隊列,下一個從新開始由1開始報數;到最後一個時,第一個接着報數;以此類推,直到剩下最後一個人,就是勝利者。
在linux中,c89模式的環境中,遊戲的程序實現如下:
#include <stdio.h>
#define H 12757 //如果有12757的序號,請改變H的值
int main(){
int n,m;
printf("請輸入人數:");
scanf("%d",&n);
int a[n],i;
for(i=0;i<n;i++){
printf("請輸入第個%d人的號碼:",i+1);
scanf("%d",&a[i]);
}
printf("請輸入要踢出的人的報數號碼:");
scanf("%d",&m);
int *p1,*p2,*p3,s=0;
p1=&a[0];
p3=&a[0];
p2=&a[n-1];
for(i=0;i<n;i++){
if(a[i]==0){
a[i]=H;
p3++;
break;
}
}
p3=a;
for(i=0;i<n-1;i++){
s=0;
while(1){
if((*p3)!=0){
s++;
}
if(s==m){
*p3=0;
if(p3==p2){
p3=p1;
}
else{
p3++;
}
break;
}
if(p3==p2){
p3=p1;
}
else{
p3++;
}
}
}
for(i=0;i<n;i++){
if(a[i]!=0){
if(a[i]!=H){
printf("第%d個爲最後存活的人,序號爲%d\n",i+1,a[i]);
}
else{
a[i]=0;
printf("第%d個爲最後存活的人,序號爲%d\n",i+1,a[i]);
}
}
}
return 0;
}
程序中首先讓你決定由幾個人玩遊戲,在給每一個人一個序號(序號可以無序,可以爲0;但是不可以是N的值,有的話可以改變N的值就可以了。),接着程序會自動運行,選出最後一個,再輸出。
實現的具體過程:
首先建立一個有n-1循環的for循環(n爲人數)
然後再建立一個無限循環:其中1.判斷此人是否離開,如果不是s+1(s是人報的數),再判斷s是否等於m,等於就離開。然後下一個報數,如果是最後一個人,則下一個轉回到第一個。
執行完for循環時就剩最後一個人,輸出。
程序執行的結果是:
輸入各種數據:輸出的結果是:
可以看出,輸出的值是正確的。
這裏要注意N我定值是12757,所以序號不可以輸入12757.