oj 1067: 順序排號

問題:

Description

有n人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來的第幾號的那位。

Input

初始人數n

Output

最後一人的初始編號

Sample Input

3

Sample Output

2

HINT

Source

思路:

i進行整個計數,k進行3個人循環計數,k循環3次就令其重新爲0,而i循環一圈後,i變爲1,直至剩下一個人。

代碼:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n,i,k=1,j,m=0;
    scanf("%d",&n);
    int a[20];
    for(i=1; i<=n; i++)
        a[i]=i;
    i=1;
    while(m<n-1)
    {
        if(a[i]!=0)
            k++;
        if(k==3)
        {
            a[i]=0;
            k=0;
            m++;
        }

        i++;
        if(i==n+1)
            i=1;
    }
    for(j=1; j<=n; j++)
    {
        if(a[j]!=0)
            printf("%d",j+1);
    }
    return 0;
}

小結:麻煩在於每一次都要1,2,3的循環,而且總人數在變,但還有一個問題,這個代碼除了n=3時正確,n=其他時都可能發生錯誤,但提交是ac的,下面附上正確的代碼:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n,i,k=0,j,m=0;
    scanf("%d",&n);
    int a[50];
    for(i=0; i<n; i++)
        a[i]=i+1;
    i=0;
    while(m<n-1)
    {
        if(a[i]!=0)
            k++;
        if(k==3)
        {
            a[i]=0;
            k=0;
            m++;
        }
        i++;
        if(i==n)
            i=0;
    }
    for(j=0; j<n; j++)
    {
        if(a[j]!=0)
            printf("%d",j+1);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章