開燈問題:
有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的完全平方數。