开灯问题:
有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;
}
技巧分析:
- memset(a, 0, sizeof(a))作用是把数组清0,在<string.h>中定义,较为方便。
- 输出技巧:为了避免输出多余空格,设置了一个标志变量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的完全平方数。