問題:
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;
}