每日一C:开灯关灯问题

  • 2017-09-27
  • 231
  • 0
  • 0

描述

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

输入

输入一组数据:n和k

输出

输出开着的灯编号

样例输入

7 3

样例输出

1 5 6 7

解:

开一个足够大的数组,模拟整个过程~

#include<stdio.h>  
#include<string.h>  
#define MAXN 1000+10  
int a[MAXN];
int main() {
	int i, j, n, k, first = 1;
	memset(a, 0, sizeof(a));//把数组a清零  
	scanf("%d%d", &n, &k);
	//k个人对n盏灯进行操作   
	for (i = 1; i <= k; i++)
		for (j = 1; j <= n; j++)
			if (j%i == 0) a[j] = !a[j];
	//输出最后剩下的灯的编号       
	for (i = 1; i <= n; i++)
		if (a[i]) {
			if (first)first = 0;//去除第一数之前的空格   
			else
				printf(" ");
			printf("%d", i);
		}
	printf("\n");
	return 0;
}

小伟也第一次看见memset函数,查阅百度,上面的意思就是将已开辟内存空间 a 的首sizeof(a) 个字节的值设为值 0

//k个人对n盏灯进行操作:

人的编号是从1~k,灯的编号是从1~n, 第一位兄弟开始遍历1~n号灯按钮,判断j%i == 0取余运算后为0的灯都会按一下.然后一直轮到n号兄弟操作完毕 , for循环结束.

//输出最后剩下的灯的编号:

遍历所有灯,只要if (a[i])为真,则输出灯编号!

by:热拌凉(2374049400)分享的作业题

评论

偷偷告诉你,这还毛都没有 T T

发表评论