问题描述:
有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依次类推,一共有k个人,问最后有哪些灯开着。
输入两个整数 n 和 k ;1<=n<=1000;1<=k<=n;
输出所有开着灯的编号
Input
本题有多组测试数据,对于每组测试数据输入两个正整数,灯数 n 和人数 k ,以空格分隔;1<=n<=1000;1<=k<=n;
Output
对于每组测试数据,从小到大依次输出仍然亮着的灯号,灯号之间以一个空格分隔,每行首尾不得有多余空格
Sample Input
7 3
10 5
20 20
25 30
Sample Output
1 5 6 7
1 4 6 7 8 10
1 4 9 16
1 4 9 16 25
代码如下:
#include <bits/stdc++.h>
using namespace std;
int a[1005];
int main()
{
int n, k, first = 1; //n 盏灯,k 个人
memset(a, 0, sizeof(a)); //初始化a
scanf("%d %d", &n, &k);
for(int i = 1; i <= k; i++)
{
for (int j = 1; j <= n; j++)
{
if (j % i == 0)//j是i的倍数
a[j] = !a[j];
}
}
for (int i = 1; i <= n; i++)
{
if (a[i])
{
if (first)
first = 0;
else
printf(" ");
printf("%d", i);
}
}
printf("\n");
return 0;
}
819

被折叠的 条评论
为什么被折叠?



