Bootstrap

开灯问题

开灯问题:

有n盏灯,编号为1-n。第1个人把所有的灯都打开,第2个人按下所有编号为2的倍数的开关(这些灯将被
关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关掉),以此类推,
一共有k个人,问最后有哪些等开着?输入n和k,输出开着的灯的编号。k<<n<<100.**

这是一个数组的简单应用。

C语言:

#include<stdio.h>
#include<string.h>
const int N = 1010;
int a[N];
int main()
{
	int n, k;
	scanf("%d%d", &n, &k); 
	int first = 1;
	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);
		}
		printf("\n");
		return 0;
}

技巧分析:

  1. memset(a, 0, sizeof(a))作用是把数组清0,在<string.h>中定义,较为方便。
  2. 输出技巧:为了避免输出多余空格,设置了一个标志变量first,可以表示当前输出变量是否为第一个,第一个变量前不应有空格,但其他变量都有。

洛谷上也有一个开灯问题,我们来看看不同之处

题目链接:P1876 开灯

这道题主要让我们学习一个完全平方数的思想,很多题都涉及。

在这里插入图片描述
看代码:

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	for(int i = 1; i * i <= n; i ++ )
		cout << i * i << " ";
}

什么是完全平方数?
就是对于一个数n,只有奇数个因子,如果不是完全平方数,一定会有偶数个因子。

分析:

  • 如果 i 是 n 的因子, 那么n / i 也一定是n 的因子,假如 i = 3,n = 18,另一个因子就是6,所以n有偶数个因子,像4, 9, 16这样n / i = i ,因子只有这么一个,n = i * i, n就是完全平方数。
  • 对于此题,灯只有开和关两种状态,类比于奇数和偶数,由于灯的开关按偶数次,还是关,所以按奇数次的就是开,所以只需要求出<= n的完全平方数。
;