问题描述《算法竞赛入门经典》:n个灯、第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关,这些灯将被关闭,第3个人按下所有编号为3的倍数的开关,打开的将被关闭,关闭的将被打开,以此类推,问第k个人过后,哪些灯开着,输入n和k,k<=n<=100
CODE:
#include <stdio.h>
#include <string.h>
#define max 1000
int a[max];
int main()
{
int n, k;
int i, j;
memset(a, 0, max);
scanf("%d%d", &n, &k); //输入灯和人的数量
for (i = 1; i <= k; i++) //从第1个人到第k人
for (j = 1; j <= n; j++) //从第1个灯到第n个灯
if (j % i == 0) //第j个灯的编号是第i个人的倍数
a[j] = !a[j]; //每个人来时就对灯的状态取反
for (i = 1; i <= n; i++)
if (a[i]) //on,输出打开着的灯
printf("%d ", i); //i'th is on
printf("\n");
return 0;
}
示例:
输入:3 4
输出:1
^_^ THE END