【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("\n"); } int main() { input_data(); get_ans(); output_ans(); return 0; }