1056: C语言程序设计教程(第三版)课后习题10.5
Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lldSubmitted: 114 Accepted: 78
[ Submit][ Status][ Web Board]
Description
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
Input
初始人数n
Output
最后一人的初始编号
Sample Input
3
Sample Output
2
#include<stdio.h>
void main()
{
int a[1000],i,j,n,f;
while(scanf("%d",&n)!=EOF)
{
for (i=1;i<=n;i++)
a[i]=i;
f=0;
i=1;
while (i<=n+1)
{
f++;
if (f%3==0)
{
for (j=i;j<n;j++)
a[j]=a[j+1];//此时虽然元素前移了,但是<div> //如果有 1 、2、3、4四个人,现在第三个人报完了3,此时i=3,那么它出列了,那么n就成3了。
//这个时候i>=n+1,i就成1了,下次从第一个人开始报。那么第四个人就成抛弃了。
</div>
n--;
printf("%d ",n);
}
if (n==1)
break;
i++;
if (i>=n+1)//这个地方会有问题,
i=1;
}
printf("%d\n",a[1]);
}
}
#include<stdio.h>
int main()
{
int a[100000],i,j,n,f;
while(scanf("%d",&n)!=EOF)
{
for (i=1;i<=n;i++) a[i]=i;
f=0,i=1;
while (1)
{
f++;
if (f%3==0)
{
for (j=i;j<n;j++) a[j]=a[j+1];
n--;
if(i>=2) i--;//正确的做法是加上这两句话
else i=n;//
}
if (n==1) break;
if (++i>=n+1) i=1;
}
printf("%d\n",a[1]);
}
return 0;
}