开灯问题
有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。k≤n≤1000。
样例输入:
7 3
样例输出:
1 5 6 7
#include <iostream>
#include <cstring>
#define maxn 100
int a[maxn];
//#include <algorithm>
using namespace std;
int main()
{
int n,k,first = 1;
memset(a, 0, sizeof(a)); //把数组a清零
cin >> n >> k;
for (int i = 1; i <= k; i++)
for (int j = 1; j <= n; j++)
if (j % i == 0) a[j] = !a[j]; //当i为1时,a[j]全为1,即全开灯。i为2时,j是2的倍数则a[j]为0,即关灯;
for(int i =1;i<=n;i++)
if (a[i]) //若a[j]为1,则开着,输出
{
if (first) //为避免输出多余空格,设置了标志变量first,表示当前要输出的变量是否为第一个,第一个前没有空格
first = 0;
else
cout << " " ;
cout<<i;
}
cout << "\n";
return 0;
}
memset函数
函数原型:void *memset(void *str, int c, size_t n)
解释:复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
作用:是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法

浙公网安备 33010602011771号