由開鎖智力題得出一種求平方數的方法

2021-04-13 06:10:31 字數 1859 閱讀 2789

題目:

在一條長長的走廊上依次排列著

100把鎖著的鎖頭。你從把這

100把鎖全部開啟開始(第

1遍)。然後,你把所有序號是

2的倍數的鎖頭再鎖上(第

2遍)。接下來,你依次走到所有序號是

3的倍數的鎖頭前,如果它是開啟的,就把它鎖上;如果它是鎖上的,就把它開啟——我們把這稱為「切換鎖頭的狀態」(第

3遍)。你繼續像這樣在第

n遍去切換所有序號是

n的倍數的鎖頭的狀態。當進行到第

100遍時,你將只切換第

100把鎖頭的狀態。

請問:在如此這般地進行了

100遍切換之後,有多少鎖頭是開啟的?

答案

:進行

100遍切換之後,有鎖

1,4,9,16.....100,共10

把鎖頭是開啟的;

如果走廊裡依次排列著

k把鎖頭,那麼在第k遍後

,有鎖1,4,9,16.....,|sqrt(k)|

鎖頭是開啟的.

證明

:100

把鎖頭分別標記為

s1,s2,s3,..,si,..,s100   s1

只在第1

遍被切換狀態;

如果i是素數,si

只是在第

1遍和第

i遍被切換狀態

,切換次數為偶數個;

如果i是非平方數的合數

,則總可以分解為

i=m*n=q*p=....=r*u(m!=n,q!=p,....,r!=u),si

只是在第1遍

,第i遍

,第m,n,q,p,...,r,u

遍被切換狀態

,切換次數為偶數個;

如果i是平方數時

,i=m*n=q*p=....=r*u=x*x(m!=n,q!=p,....,r!=u),si

只是在第1遍

,第i遍

,第m,n,q,p,...,r,u遍,

第x遍被切換狀態

,切換次數為奇數個;

切換之前

,鎖頭是鎖著的狀態

,經過偶數次切換後

,鎖頭還是鎖著的狀態;

切換之前

,鎖頭是鎖著的狀態

,經過奇數次切換後

,鎖頭變為開啟著的狀態.

因此,只有當i

是平方數的鎖頭被開啟.

演算法

:

由開鎖智力題的操作步驟

,我們可以獲得啟發

,按照這種方法獲取平方數.

step1:

將數的狀態值都設定為

-1;

step2:

將所有數依此模

1,2,3,....,100,

如果結果為

0,就改變狀態;

step3:

列印出狀態值為1的數

. 程式

:

下面是利用這一方法獲取

[1,100]

區間上平方數的程式

,**在

vc++6.0

平台執行成功.

date:2007.2.15

findsquarenumber .cpp**/

#include

#include

using namespace std;

void main()

if(a==1)

cout<<"square number :"< }

system("pause"); }

求職面試 智力題 智力題彙總

25匹馬 5個跑道 找top3,要多少次比賽 top3 推廣 找top5 解答 最後拿完對局 請設計乙個遊戲 地面上擺放著若干顆石子,甲乙兩人輪流從中提取石子,每人每輪最少提取2顆,最多提取5顆,取到最後一顆石子者為勝 請設定這堆石子的顆數 至少50顆 使先手有必勝的策略,並說明你的策略 設定的石子...

面試智力題

最近蒐集了一些面試的智力題,特來分享一下,改變下思維方式 1 燒一根不均勻的繩子,從頭燒到尾總共需要1個小時,問如何用燒繩子的方法來確定半小時的時間呢?2 10個海盜搶到了100顆寶石,每一顆都一樣大小且價值連城。他們決定這麼分 1 抽籤決定自己的號碼 1 10 2 首先,由1號提出分配方案,然後大...

筆試智力題

1.如何快速找出乙個32位整數的二進位制表達裡有多少個 1 用關於 1 的個數的線性時間?答案1 關於數字位數線性 for n 0 b b 1 if b 1 n 答案2 關於 1 的個數線性 for n 0 b n b b 1 2.乙個大小為n的陣列,所有數都是不超過n 1的正整數。用o n 的時間...