問題描述: 有編號1~100個燈泡,起初所有的燈都是滅的。有100個同學來按燈泡開關,如果燈是亮的,那麼按過開關之後,燈會滅掉。如果燈是滅的,按過開關之後燈會亮。現在開始按開關。第1個同學,把所有的燈泡開關都按一次(按開關燈的編號: 1,2,3,......100)。第2個同學,隔一個燈按一次(按開 ...
問題描述: 有編號1~100個燈泡,起初所有的燈都是滅的。有100個同學來按燈泡開關,如果燈是亮的,那麼按過開關之後,燈會滅掉。如果燈是滅的,按過開關之後燈會亮。
現在開始按開關。
第1個同學,把所有的燈泡開關都按一次(按開關燈的編號: 1,2,3,......100)。
第2個同學,隔一個燈按一次(按開關燈的編號: 2,4,6,......,100)。
第3個同學,隔兩個燈按一次(按開關燈的編號: 3,6,9,......,99)。
......
問題是,在第100個同學按過之後,有多少盞燈是亮著的?這些燈的編號是多少?要求給出解題思路或給出偽碼。
c#代碼
static void TurnLights() { //存放一百個燈的亮滅情況,預設為滅,這裡取101是為了從編號1到100 方便數字的處理無其他意義 bool[] lights = new bool[101]; //從第1個同學到第100個,依次按燈 for (int i = 1; i <= 100; i++) { //從第i個燈開始,隔著i-1個燈按,所以j+=1 for (int j = i; j <= lights.Length - 1; j += i) { //進行取反操作 lights[j] = !lights[j]; } } for (int i = 1; i <= lights.Length-1; i++) { if (lights[i]) { //輸出亮著的燈編號 Console.Write(i+" "); } } }
Lua代碼
function TurnLights() --boolean類型的燈數組 lights={} --i為學生號碼,依次從第一個同學到最後一個同學依次按燈 for i=1,100,1 do for j=i,100,i do lights[j]=not lights[j] end end for i=1,table.getn(lights),1 do if lights[i]==true then print(i) end end end TurnLights()
最終得出的結果是以下編號的燈亮著
1
4
9
16
25
36
49
64
81
100