【2042】模拟开关

Time Limit: 1second
Memory Limit: 20 MB

问题描述
有N盏灯排成一排,依次编号为1,2,3,4……N,各有一个开关。开始时,灯都是亮着的。现在还有N个人,第一个人走过来,依次把1和1的倍数的电灯开关都拉一下;第三个人走过来,依次把3和3的倍数的电灯开关都拉一下,第五个人走过来,依次把5和5的倍数的电灯开关都拉一下……(按奇数的规律),问最后哪些编号的灯是关着的?


Input

只有一行,包括1个整数N(5<=N<=200)

Output

只有一行,由若干个空格间隔的整数组成,表示关着的灯的编号(按自然数顺序),如果没有灯是关着的,就输出0。

Sample Input

10

Sample Output

1 2 4 8 9 (9后面还有一个空格,然后换行结束)

【题解】

模拟题,按照要求模拟一下就好。一层for循环循环n个人 第二层循环循环从当前人的序号开始到n,判断第二层循环j 是否为i 的倍数,是则改变j灯的状态。

最后,不可能会没有灯是关的。毕竟1一定是开着的。

【代码】

#include <cstdio>

const int maxn = 200;

int n,a[maxn + 20];

void input_data()
{
    scanf("%d",&n);
    for (int i = 1;i <= n;i++)
        a[i] = 1;
}

void get_ans()
{
    for (int i = 1;i <= n;i++) //循环第i个人
        if ( ( i % 2) == 1) //如果i是一个奇数
            {
                for (int j = i;j <= n;j++) //如果j是i的倍数 就改变灯的状态。
                    if ( (j % i) == 0)
                        a[j] = 1-a[j];
            }
}

void output_ans()
{
    for (int i = 1;i <= n;i++)
        if (a[i] == 0)
            printf("%d ",i);
    printf("
");
}

int main()
{
    input_data();
    get_ans();
    output_ans();
    return 0;
}


 

原文地址:https://www.cnblogs.com/AWCXV/p/7632463.html