1. 程式人生 > >約瑟夫環問題【陣列】

約瑟夫環問題【陣列】

Description
 約瑟夫環問題:設有n個人圍坐一圈,並按順時針方向1—n編號。從第s個人開始進行報數,報數到第m個人,此人出圈,再從他的下一個人重新開始從1到m的報數進行下去 ,直到只剩一個人為業


Input
人數n


從第s個人開始報數s


報到第幾個數m


Output
剩下的最後一個人的編號


Sample Input
9 1 3 
Sample Output

 
 


#include <stdio.h> 
int main() 

    int n,f,s; 
    scanf("%d%d%d",&n,&s,&f);   //輸入題目中的n s f  
    int a[n+1],i,num,k;          // 定義變數 
    for(i=0; i<n; i++)       //迴圈初始化每一個人的編號 
        a[i]=i+1; 
    num=0;                     //初始化變數 
    i=s-1; 
    k=0; 
    while(num<n-1) //當剩餘一人時停止 
    { 
        if(a[i]!=0)k++; //當第i個人報數成功後k+1  
        if(k==f) //當報數的人數到達f後出圈  抹去他的編號(將a[i]賦值為0) 
        { 
            a[i]=0; 
            num++; 
            k=0; //k重新計數 
        } 
        i++;  //對下一個編號進行判斷 
        if(i==n)i=0; //當i超過編號最大值時 i從0重新計數 
    } 
    for(i=0; i<n; i++)      //迴圈判斷輸出剩下的那一個人的編號 
        if(a[i]!=0)printf("%d",a[i]); 
    return 0; 
}