開燈問題

開燈問題:

有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的完全平方數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章