大廳裡有100盞燈,每盞燈都編了號碼,分別為1-100。每盞燈由乙個開關來控制。(開關按一下,燈亮,再按一下燈滅。開關的編號與被控制的燈相同。)開始時,燈是全滅的。現在按照以下規則按動開關。
第一次,將所有的燈點亮。
第二次,將所有2的倍數的開關按一下。
第三次,將所有3的倍數的開關按一下。
以此類推。第n次,將所有n的倍數的開關按一下。
問第100次按完以後,大廳裡還有幾盞燈是亮的。
網上找了一下,此題還有其他的表述方式類似:
禮堂裡有100盞電燈,編號1-100,每盞燈由一根燈繩控制,拉一下改變狀態.開始燈全是滅的,100個同學依次進入禮堂,
第乙個學生把1的倍數的燈繩拉一下,燈全亮;
接著第二個同學把2倍數的燈繩拉一下;
第三個同學把3倍數的燈繩拉一下······第100個學生把100的倍數的燈繩拉一下.最後,禮堂裡哪些燈是亮的?
1,暴力解法:
暴力解法一般是思路上最接近題意的,按題目要求的步驟直接求解,暴力求解一般計算量也是最大的。
我一般都是先用笨辦法計算出結果,再想辦法優化。現給出c#暴力解法,得出最後的結果,**如下:
1class
program
1112
//開關完成,列印最後的結果
13 console.writeline("
最後亮燈的還有盞。
", lights.count(r =>r));
1415
//分別列印每盞燈
16for (int i = 0; i < 100; i++) 20}
2122 console.writeline("
實驗結束!");
23console.readkey();24}
2526
///27
///開關燈
28///
29///
30private
static
void changestate(int
x) 36}37
38}3940 }
上面的解法很容易就能求出結果,各位可以先自行測試一下。
2.優化
暴力解法可以得到結果,但這肯定是不能讓人滿意的。現在回過頭來再分析這個題。
第一次操作,每個燈的開關都被按一次;
第二次操作,2的倍數的開關都被按一次;
下面列出前十次,前十個數的具體情況
燈1燈2
燈3燈4
燈5燈6
燈7燈8
燈9燈10
步驟1操作
操作操作
操作操作
操作操作
操作操作
操作步驟2
操作操作
操作操作
操作步驟3
操作操作
操作步驟4
操作操作
步驟5操作
操作步驟6
操作步驟7
操作步驟8
操作步驟9
操作步驟10
操作操作次數12
2324
2434
可以看到,最下面一列是操作的次數,操作次數為奇數次的,燈最後是開啟的狀態,是偶數次,則為關閉。
被操作的規律如下:
燈1:1
燈2:1,2
燈3:1,3
燈4:1,2,4
依次寫下去,就可以發現,每個燈被操作的步驟,其實為此燈編號的因數。
如燈36被操作的步驟:1,2,3,4,6,9,12,18,36
此時題目轉化為求[1-100]100個數中,因數個數為奇數的數的數量是多少。
因為最近在學習python,求因數的演算法用python 語言給出,3.4 版本執行成功 如下:
1defgetzys(n):
2 x=2
3 zys=
4 zys.extend([1,n])
5while x*x<=n:
6if n%x==0:
7if x*x==n:
8zys.extend([x])
9else
:10 zys.extend([x,n//x])
11 x+=1
12return
zys13
14 n=input('
請輸入乙個正整數:')
15 n=int(n)
16 lb=getzys(n)
17 lb=sorted(lb)
18print
(lb)
19
此時,題目的解法已經第一次被推廣,在一定程度上,我們已經可以解決更多類似的問題。推廣後的解法請自行試著去解決。
3.就事論事
求乙個正整數的質數的過程,如上面**所示,其實就是對某個數平方根以下的數試著求餘,但具體到本題而言,轉化一下描述為,怎樣快速判斷乙個數的因數個數是否為奇數。
請看上面的**,第7-10行,如果能深刻理解這幾行,上面所述的題目會有更快的解法。
我們注意到,求乙個數因數的過程,是從1開始到其平方根,除平方根外,其他的因數都是成對的出現!,也就是,只有平方數的因數是奇數個!,100以內的平方數只有10個,分別是1,4,9,16,25,36,49,64,81,100,所以上述題目的最後結果是10個燈最後是亮著的。
優化完的**,注釋要多一些,**本身將非常之少,因為100的平方根是10,所以最後亮10盞燈。
你明白了沒有?
附:求1<=i<=10**12範圍內所有d(i)的和的末12位,d(i)表示i的正約數的和,i為整數
這個題目可以試著解一下
未完待續)
100盞燈的問題
有100盞燈,從1 100編上號,開始時所有的燈都是關著的,第一次,把所有編號是1的倍數的燈的開關狀態改變一次 第二次,把所有編號是2的倍數的燈的開關狀態改變一次 第三次,把所有編號是3的倍數的燈的開關狀態改變一次 以此類推,直到把所有編號是100得倍數的燈的開關狀態改變一次。問,此時所有開著的燈的...
100盞燈的問題
有100盞燈,從1 100編上號,開始時所有的燈都是關著的,第一次,把所有編號是1的倍數的燈的開關狀態改變一次 第二次,把所有編號是2的倍數的燈的開關狀態改變一次 第三次,把所有編號是3的倍數的燈的開關狀態改變一次 以此類推,直到把所有編號是100得倍數的燈的開關狀態改變一次。問,此時所有開著的燈的...
100盞燈開關問題
問題描述 有100盞燈泡,第一輪點亮所有電燈,第二輪每兩盞燈熄滅一盞,即熄滅第2盞,第4盞,以此類推,第三輪改變編號為3的倍數的電燈,第3盞,第6盞,如果原來那盞燈是亮的,就熄滅它,如果原來是滅的,就點亮它,以此類推,直到第100輪。問第100結束後,還有多少盞燈泡是亮的?解答 分析可知如果最後某一...