開燈關燈問題

2021-07-05 00:04:26 字數 1532 閱讀 4888

題目:

大廳裡有100盞燈,每盞燈都編了號碼,分別為1-100。每盞燈由乙個開關來控制。(開關按一下,燈亮,再按一下燈滅。開關的編號與被控制的燈相同。)開始時,燈是全滅的。現在按照以下規則按動開關。

第一次,將所有的燈點亮。

第二次,將所有2的倍數的開關按一下。

第三次,將所有3的倍數的開關按一下。

以此類推。第n次,將所有n的倍數的開關按一下。

問第n次(n大於等於2,且小於等於100)按完以後,大廳裡還有幾盞燈是亮的。

思路:1) 暴力破解  用乙個陣列代替燈  通過模擬按開關的操作  來實現

2) 通過題意  我們知道 每次按的 都是次數的 倍數  所以 我們可以通過求公約數來實現

3) 通過思路2  發現 其實 最後燈亮這的都是按了奇數次的燈。

下面是具體的解釋和**實現

為了便於程式的擴充套件性 

lights 表示燈數   

num 表示第幾次。

1)一共有100 盞燈。每一次 都把為次數的倍數燈的開關按一下。

對於這樣的問題 最先想到的當能是暴力迴圈了。  用乙個裝有100 個元素的boolean 型別的陣列 代表這100 盞燈。暴力迴圈 每按一次按鈕 對應元素的值變換一次。 

public static void findlights(int lights,int num) }}

// 統計

int count = 0;

for (int i = 0; i< array.length;i++)

system.out.println("最後亮了 " + count + " 盞燈!");

} }

2)按下次數的倍數的開關。 可以反過來理解為 當次數是燈的編號的約數的時候按下開關。例如: 編號為12 的燈 在 第1,2,3,4,,6,12次被按下而 

12=1*12=2*6=3*4一共按了6次  偶數次 所以最後是關著的   編號為9的等 在第1,3,9次被按下 一共按了奇數次 所以最後燈是開著的。

public static void findlights2(int lights,int num) 

}if (count%2!=0) total++;

count = 0; // 下一盞燈 重新計算

}system.out.println("最後亮了 " + total + " 盞燈!");

} }

3) 通過思路2我們知道了 最後亮燈的都是按了奇數次的燈。在求約數時  因為:n=a*b 有了a就有b 為了為奇數 a的等於b 。 所以 最後等亮著的是完全平方的數 

public static void findlights3(int lights,int num) }}

system.out.println("最後亮了 " + total + " 盞燈!");}}

執行效果

開燈關燈問題

有編號1 100個燈泡,起初所有的燈都是滅的。有100個同學來按燈泡開關,如果燈是亮的,那麼按過開關之後,燈會滅掉。如果燈是滅的,按過開關之後燈會亮。現在開始按開關。第1個同學,把所有的燈泡開關都按一次 按開關燈的編號 1,2,3,100 第2個同學,隔乙個燈按一次 按開關燈的編號 2,4,6,10...

開燈關燈問題

有編號1 100個燈泡,起初所有的燈都是滅的。有100個同學來按燈泡開關,如果燈是亮的,那麼按過開關之後,燈會滅掉。如果燈是滅的,按過開關之後燈會亮。現在開始按開關。第1個同學,把所有的燈泡開關都按一次 按開關燈的編號 1,2,3,100 第2個同學,隔乙個燈按一次 按開關燈的編號 2,4,6,10...

開燈關燈問題

有編號1 100個燈泡,起初所有的燈都是滅的。有100個同學來按燈泡開關,如果燈是亮的,那麼按過開關之後,燈會滅掉。如果燈是滅的,按過開關之後燈會亮。現在開始按開關。第1個同學,把所有的燈泡開關都按一次 按開關燈的編號 1,2,3,100 第2個同學,隔乙個燈按一次 按開關燈的編號 2,4,6,10...