當前位置:編程學習大全網 - 編程語言 - 今天參加了壹個IT公司的面試 有兩道開放性試題沒答上來 誰能幫幫忙 講壹下答案和道理

今天參加了壹個IT公司的面試 有兩道開放性試題沒答上來 誰能幫幫忙 講壹下答案和道理

答案: 進行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平臺運行成功.

/**author:mapping

date:2007.2.15

FindSquareNumber .cpp**/

#include <iostream>

#include <process.h>

using namespace std;

void main()

{

int a;

int i;

for(i=1; i<= 100; i++)

{

a=-1;

for(int j=1;j<=i;j++)

{

if(i%j==0)

a=(-1)*a;

}

if(a==1)

cout<<"square number :"<<i<<endl;

}

system("pause");

}

  • 上一篇:?“更強悍的汽車機器人”,長安歐尚Z6 2.0T車型上市
  • 下一篇:中國歷史博物館的機構設置
  • copyright 2024編程學習大全網