开灯问题

有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 个字符。
作用:是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法

posted @ 2024-11-17 23:52  xue567  阅读(37)  评论(0)    收藏  举报