1. 程式人生 > >C:n人站成一圈,報數到m的人離開隊伍,求最後剩下的是第幾人

C:n人站成一圈,報數到m的人離開隊伍,求最後剩下的是第幾人

//n人站成一圈,報數到m的人離開隊伍,求最後剩下的是第幾人
int lastOne(int n,int m)
{
    if (m>n||n<=0||m<=0) {
        printf("Range wrong\n");
        exit(EXIT_FAILURE);
    }
    
    int arr[n];
    //陣列長度為n,值全為1,存放n個人
    for (int i=0; i<n; i++) {
        arr[i]=1;
    }
    //計數器
    int counter=0;
    //新第一人位置
    int first=0;
    //新最後一人位置
    int last=0;
    for (int i=0; i<n; i++) {
        //判斷第i人是否為0
        if (arr[i]!=0) {
            //記錄新第一人的位置
            if (counter==0) {
                first=i;
            }
            counter++;
            //記錄新最後一人的位置
            if (counter==m-1) {
                last=i;
            }
        }
        //將第m人清零
        if (counter==m) {
            //第一人迴圈被加兩次==m,則剩下人數已不夠m,結束
            if (i==first) {
                break;
            }
            counter=0;
            arr[i]=0;
        }
        //不停遍歷
        if (i==n-1) {
            i=-1;
        }
    }
    
    return last+1;
}