计算灯的开关状态
计算灯的开关状态。有N个灯放在一排,从1到N依次顺序编号。有N 个人也从1到N依次编号。1号将灯全部关闭,2号将凡是2的倍数的灯打开;3号将凡是3的倍数灯相反处理(该灯如为打开的,则将它关闭;如关闭,则将它打开)。以后的人都和3号一样,将凡是自己编号倍数的灯作相反处理。试计算第N个人操作后,哪几只灯是亮的?(0—表示打开,1—表示关闭)
常规写法
var k,n,i,j: integer;
a: array[1…range] of boolean
begin
readln(n);
for i := 1 to n do a[i] = false
for i := 1 to n do
begin
j := i;
while j < n do
begin
a[j] = not(a[j]);
j = i + j;
end;{while}
end;{for}
for i := 1 to n do write(ord(a[i]));
writeln();
end;{main}
简写
这是大牛写的算法,对于 i += n = 1,表示不懂。
ps: 求看懂的留下点看法,谢过!
var n, range:int;
for(var i:int = 1; i <= range; i += n = 1) {
while(n > 0)
n = n > i / n ? 0 : !(i % n) ? i / n == n ? -1 : n + 1 : n + 1;
if(n == -1) trace(“结果”,i);
}
实际使用
如果通过大量计算,得知只要n能够开平方,则就可以判断该灯的状态是关闭。
因此,该算法在项目中可以写作:
var range:int;
var n = Math.pow(range,0.5);
for(var i = 1; i <= n; i++) {
print(“result:” + i * i)
}