C语言题目:开灯问题。有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉)...

开灯问题。有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。k 样例输入:
7 3
样例输出:
1 5 6 7

注:1.初始化数组全为零,表示灯都是关的。

       2.用memset()函数把数组清零,头文件string.h。

       3.标志量first,输出时判断是否为第一个。

#include
#include
#define N 1010

int a[N];
int main() {
	int n, k, first = 1;
	scanf("%d%d", &n, &k);
	memset(a, 0, sizeof(a));
	for (int i = 1; i <= k; i++) {
		for (int j = 1; j <= n; j++) {
			if (j % i == 0)
				a[j] = !a[j];//非零表示灯是开的
		}
	}
	for (int i = 1; i <= n; i++) {
		if (a[i]) {
			if (first)
				first = 0;
			else
				printf(" ");
			printf("%d", i);
		}
	}
	return 0;
}

谢谢观看!!

你可能感兴趣的:(c语言,算法,开发语言)