背景:输出格式永远是程序员的痛啊,所以请一定注意输出格式。
学习:刚看了同学的博客,发现这道题会在小紫书的那个地方出现,是为了让我们练习自底向下的函数构建方式,所以请有兴趣读者自行将下面的代码改成自底向下的函数构建方式,不要像我一样一个main函数到底,因为程序小,一个main函数可以到底,但是当程序大的时候,只写一个main函数的话就过于麻烦。
思路:本题主要在这两个地方需要注意
for(int i=0;i<k;)
{
del1=(del1+1)%n;
if(ok[del1]==1) i++;
}
for(int j=0;j<m;)
{
if(del2==0) del2=n-1;
else del2--;
if(ok[del2]==1) j++;
}
一个是逆时针数,一个是顺时针数,逆时针数简单,直接加一再对n取余就好了,但是顺时针数的时候就不能一直直接减一了,因为当del2为0的时候,减一就不对了,在这个时候就直接把del2赋值为n-1就好了。然后还需要注意的一点就是del1和del2可能相等,在这个问题上就分开处理就好了。
if(del1==del2)
{
ok[del1]=0;
sum+=1;
printf("%3d",Queue[del1]);
}
else
{
ok[del1]=ok[del2]=0;
sum+=2;
printf("%3d%3d",Queue[del1],Queue[del2]);
}
下面附完整代码。
#include <stdio.h>
int main(void)
{
int Queue[21];
int n,k,m;
while(scanf("%d %d %d",&n,&k,&m)==3&&n&&k&&m)
{
int ok[21];
for(int i=0;i<n;i++)
{
Queue[i]=i+1;
ok[i]=1;
}
int del1=-1,del2=n;
for(int sum=0;sum<n;)
{
if(sum) printf(",");
for(int i=0;i<k;)
{
del1=(del1+1)%n;
if(ok[del1]==1) i++;
}
for(int j=0;j<m;)
{
if(del2==0) del2=n-1;
else del2--;
if(ok[del2]==1) j++;
}
if(del1==del2)
{
ok[del1]=0;
sum+=1;
printf("%3d",Queue[del1]);
}
else
{
ok[del1]=ok[del2]=0;
sum+=2;
printf("%3d%3d",Queue[del1],Queue[del2]);
}
}
printf("\n");
}
return 0;
}