如果在走廊裏依次排列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是平方數時,鎖才會被打開。
算法:從解謎的操作步驟中,我們可以得到啟發,通過這種方式得到平方數。
步驟1:將數字的狀態值設置為-1;
第二步:根據這個模塊制作所有的數字1,2,3,...,100,如果結果為0,則改變狀態;
第三步:打印出狀態值為1的數字。
程序:下面是用這種方法求區間[1,100]的平方數的程序。代碼在vc++6.0平臺上運行成功。
/* *作者:制圖
日期:2007.2.15
FindSquareNumber。cpp**/
# include & ltiostream & gt
# include & ltprocess.h & gt
使用命名空間std
void main()
{
int a;
int I;
for(I = 1;我& lt= 100;i++)
{
a =-1;
for(int j = 1;j & lt= I;j++)
{
如果(i%j==0)
a =(-1)* a;
}
如果(a==1)
cout & lt& lt"平方數:" & lt& lt我& lt& ltendl
}
系統(“暫停”);
}