原文链接:https://rosettacode.org/wiki/100_doors
有 100 扇最初全是关闭的门,你总共要通过 100 次。
通过时规则如下:
第 1 次,访问每 1 扇门,并切换门的状态(如果门关闭,则打开它;如果门开着,则关闭它)。
第 2 次,只访问序号是 2 的倍数的门(#2、#4、#6,…),并切换其状态。
第 3 次,只访问序号是 3 的倍数的门(#3、#6、#9,…),并切换其状态。
……
第 100 次,只访问第 100 扇门。
任务
回答问题:最后一次通过后门处于什么状态?哪些是开着的,哪些是关闭的?
备注:正如本页对应的讨论页所述,唯一还打开的门是那些数字是平方数的门。
标准方法
Loop, 100
Door%A_Index% := "closed"
Loop, 100 {
x := A_Index, y := A_Index
While (x <= 100)
{
CurrentDoor := Door%x%
If CurrentDoor contains closed
{
Door%x% := "open"
x += y
}
else if CurrentDoor contains open
{
Door%x% := "closed"
x += y
}
}
}
Loop, 100 {
CurrentDoor := Door%A_Index%
If CurrentDoor contains open
Res .= "Door " A_Index " is open`n"
}
MsgBox % Res
方法二
利用公式:
increment := 3, square := 1
Loop, 100
If (A_Index = square)
outstring .= "`nDoor " A_Index " is open"
,square += increment, increment += 2
MsgBox,, Succesfull, % SubStr(outstring, 2)
优化后方法
While (Door := A_Index ** 2) <= 100
Result .= "Door " Door " is open`n"
MsgBox, %Result%
https://www.autoahk.com/archives/7050 这个已经整理过了