pascal旅馆的房间

发布时间:2024-05-16 10:00 发布:上海旅游网

问题描述:

旅馆里有一百个房间,从1到100编了号,第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间作“相反处理”……,以后都是如此。问第100个服务员来过后,哪几扇门是打开的。

问题解答:

楼上的答案绝对是错误的,则其程序也有错
正确的答案是1,4,9,16,25,36,49,64,81,100
即各完全平方数
这可以用数学方法证明
每扇门都有标号,标号的因子个数决定了这扇门开或关
普通的数至少可以被1和它本身整除,这样门都至少被改变2次
即使有1和本身以外的因子,也肯定是偶数个
因为两两因子一定是对称的
如12的因子有1,3,4,12
有3就一定有4与之对称
所以普通的数因子数一定是偶数,这样门的状态就不会变
只有完全平方数除外
因为完全平方数有1个因子被重复使用2次
如25因子有1,5,5,25
5有2个,但状态只改变1次,所以只有完全平方数的因子个数为奇数
故只有完全平方数的门状态改变会打开

分太少,程序就懒得写了,楼主应该能看懂吧

1
4
6
10
14
16
18
22
24
26
30
34
38
40
42
46
50
54
56
58
62
64
66
70
72
74
78
82
86
88
90
94
96
98
100
答案就是上面这些
源程序如下:
var i,j,k:longint;
a:array[1..100]of boolean;
begin
for i:=1 to 100 do a[i]:=true;
j:=1;
repeat
inc(j);
if a[j]=true then a[j]:=false else a[j]:=true;
k:=j+j;
if k<101 then begin
repeat
if a[k]=true then a[k]:=false else a[k]:=true;
k:=k+k;
until k>99;
end;
until j=100;
for i:=1 to 100 do if a[i] then writeln(i);
end.
如果楼主觉得有错
可以M我或者自己作修改

用repeat循环和boolean记录处理就可以了。

?

热点新闻