題目:
在一條長長的走廊上依次排列著
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 的時間...