由100盞燈想到的(一)

2022-02-03 19:31:43 字數 2922 閱讀 9657

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

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

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

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

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

問第100次按完以後,大廳裡還有幾盞燈是亮的。

網上找了一下,此題還有其他的表述方式類似:

禮堂裡有100盞電燈,編號1-100,每盞燈由一根燈繩控制,拉一下改變狀態.開始燈全是滅的,100個同學依次進入禮堂,

第乙個學生把1的倍數的燈繩拉一下,燈全亮;

接著第二個同學把2倍數的燈繩拉一下;

第三個同學把3倍數的燈繩拉一下······第100個學生把100的倍數的燈繩拉一下.最後,禮堂裡哪些燈是亮的?

1,暴力解法:

暴力解法一般是思路上最接近題意的,按題目要求的步驟直接求解,暴力求解一般計算量也是最大的。

我一般都是先用笨辦法計算出結果,再想辦法優化。現給出c#暴力解法,得出最後的結果,**如下:

1

class

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 版本執行成功 如下:

1

defgetzys(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結束後,還有多少盞燈泡是亮的?解答 分析可知如果最後某一...