數學回味系列之4 開燈關燈問題

2021-07-27 07:13:25 字數 1623 閱讀 4959

問題提出:

有編號1~100個燈泡,起初所有的燈都是滅的。有100個同學來按燈泡開關,如果燈是亮的,那麼按過開關之後,燈會滅掉。如果燈是滅的,按過開關之後燈會亮。

現在開始按開關。

1個同學,把所有的燈泡開關都按一次(按開關燈的編號:1,2,3,......100)。

2個同學,隔乙個燈按一次(按開關燈的編號:2,4,6,......,100)。

3個同學,隔兩個燈按一次(按開關燈的編號:3,6,9,......,99)。

問題是,在第100個同學按過之後,有多少盞燈是亮著的?

解決思路:

明顯這是乙個奇偶問題,乙個燈 奇數次是亮著的,偶數次就滅了。

那這個問題就變成了乙個判斷奇數偶數的數學問題。

先最簡單的思路,模擬這個過程,light[i][j]代表第 i 個人按了第 j 個燈,直接上**:

/* linolzhang 2008.05

*/// 蒐集過程

int light[100][100];

for(int i=0;i<100;i++)

for(int j=0;j<100;j++)

if(j%i == 0)

// 累加過程(j列對應和為偶數為滅)

int statu[100] = ;

for(int j=0; j<100; j++)

感覺這個問題已經很完美的解決了?

*也許不是,你應該有更好的思路。

light 1 只會被第1個同學按;

light 2 只會被第1個同學和第2個同學按;

light 3 只會被第1個同學和第3個同學按;

light 4 只會被第1個同學、第2個同學以及第4個同學按;

light n 只會被第1個同學、……、第n個同學按;

找到規律了嗎?沒錯,這是乙個簡單的因式分解題,只需要求 該序號n 能被哪些數整除?

int getcount(int num)

{ int count = 0; // 因子個數

for(int i=1;i

*那還有沒有第三種解法呢?有

接著上面來看,什麼樣的編號具有奇數個因子,什麼樣的編號具有偶數個因子?來看 質因數分解的定理:

任何正數都能被唯一表示成多個質因數冪次乘積的方式。

36 = 2^2 * 3^2(2、3、6)

64 = 2^3 * 2^3 (2、4、8、16、32)

99 = 3^2 * 11    (3、9、33、11)

我們得到結論,只有指數和為偶數次的 其因子才會是奇數個,那麼滿足這個條件的是哪些呢?

必須滿足完全平方數。

ok,我們得到結論,1~100中完全平方數有 1, 4, 9, 16, 25, 36, 49, 64, 81, 100 ,這10個編號的燈是亮著的。

數學回味系列之3 賽馬問題

問題提出 共有25匹馬,有乙個賽場,賽場有5個賽道,就是說最多同時可以有5匹馬一起比賽。假設每匹馬都跑的很穩定 可多次比賽 只通過馬與馬之間的比賽,沒有計時器,試問,最少需要多少場比賽才能知道跑得最快的3匹馬?解題思路 根據題目,我們首先想到的就是 1 隨機分成5組,各5匹馬,5場比賽得到 各組第1...

數學回味系列之13 殺豬問題

問題提出 有 n 頭豬 和 乙個 的屠夫 屠夫就喜歡殺單數字置上的豬,一次殺完之後,將剩下的豬按照原來的相對位置,重新排列 按照約定,最後一頭豬 取名lucky 將會被送到教堂,這是神的旨意。請問,最聰明的豬應該站在哪個位置,才能成為這個幸運兒?解題思路 分析這個問題,我們發現,奇數字是危險的,每一...

數學回味系列之10 高樓扔雞蛋

問題提出 有座100層的建築,雞蛋從某一層扔下來有可能摔碎 可能是,也可能是 你手上有兩個軟硬程度一樣的雞蛋,要判斷出來哪一層是雞蛋可以安全落下的最高位置。最少需要扔多少次?解題思路 最笨的方法,從1層開始,每層都扔1次,直到摔碎 為止,得到當前當前層數 n。最差需要100次 好像只需要乙個雞蛋就夠...