算法入门经典之开灯问题(输出一排数时的处理方式)

    有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯被打开,       开着灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?

    输入:n和k,输出开着的灯编号。k≤n≤1000。

   样例输入:7  3

   样例输出:1 5 6 7 

   思路就像昨天那题校门外的树一样,进行标记即可。这题要注意的是输出的格式,往往在OJ上输出一排数时要求是最后一个数后面不能有空格,这题输出的格式值得我们学习

我的代码:

<span style="color:#333333;">#include <stdio.h>
#include <stdbool.h>

bool lamp[1010];

int main()
{
    int i, j;
    int n, k;
    while(scanf("%d%d", &n, &k)!=EOF)
    {
        for(i=1;i<=n;i++)
            lamp[i]=true;
        for(i=2;i<=k;i++)
        {
            for(j=1;i*j<=n;j++)
                lamp[i*j]=(!lamp[i*j]);
        }

       </span><span style="color:#ff0000;"> for(i=1;i<=n;i++)
        {
            if(lamp[i])
            {
               printf("%d", i);
               lamp[i]=!lamp[i];
               break;
            }
        }

        for(i=1;i<=n;i++)
        {
            if(lamp[i])
               printf(" %d", i);
        }
</span><span style="color:#333333;">
        printf("\n");
    }

    return 0;
}
</span>
书上的输出方式:

<span style="color:#333333;">#include <stdio.h>
#include <stdbool.h>

bool lamp[1010];

int main()
{
    int i, j;
    int n, k;
    while(scanf("%d%d", &n, &k)!=EOF)
    {
        bool first=true;
        for(i=1;i<=n;i++)
            lamp[i]=true;
        for(i=2;i<=k;i++)
        {
            for(j=1;i*j<=n;j++)
                lamp[i*j]=(!lamp[i*j]);
        }

    </span><span style="color:#ff0000;">    for(i=1;i<=n;i++)
        {
            if(lamp[i])
            {
                if(first)
                    first=false;
                else
                    printf(" ");
                printf("%d", i);
            }

        }</span><span style="color:#333333;">

        printf("\n");
    }

    return 0;
}
</span>




你可能感兴趣的:(ACM,水题)