背景:输出格式永远是程序员的痛啊,所以请一定注意输出格式。
学习:刚看了同学的博客,发现这道题会在小紫书的那个地方出现,是为了让我们练习自底向下的函数构建方式,所以请有兴趣读者自行将下面的代码改成自底向下的函数构建方式,不要像我一样一个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;
}