问题:
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;
}