題目:
大廳裡有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...