您的位置:首页 > 产品设计 > UI/UE

uva133救济金发放The Dole Queue

2015-01-25 12:29 423 查看
背景:输出格式永远是程序员的痛啊,所以请一定注意输出格式。

学习:刚看了同学的博客,发现这道题会在小紫书的那个地方出现,是为了让我们练习自底向下的函数构建方式,所以请有兴趣读者自行将下面的代码改成自底向下的函数构建方式,不要像我一样一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: