pascal循环问题

来源:百度知道 编辑:UC知道 时间:2024/06/30 14:34:41
有N盏灯放在一排,从1到N依次编号,有N个人也从1到N依次编号,第一个人将灯全部打开,第二个人将凡是2的倍数的灯全部关闭,第三个人将凡是3的倍数的灯作相反处理,第4、5、……、N个人都把自己编号的倍数的灯作相反处理。问第N个人走过后,哪些灯是开着的?(要求不用数组)

var n,i,j:integer; m:boolean;

begin

write('input n:'); readln(n);

for i:=1 to n do

begin

m:=true;

for j:=2 to i do

if i/j=i div j then m:=not(m);

if m=true then writeln(i, ':open');

end

end.

卖金鱼的人将缸里的金鱼分五次全部卖出:第一次卖出全部金鱼的二分之一加二分之一条,第二次卖出剩余金鱼的三分之一加三分之一条,第三次卖出剩余金鱼的四分之一加四分之一条,第四次卖出剩余金鱼的五分之一加五分之一条,现还剩下11条金鱼,问这渔缸里原有多少条金鱼?

var n,i:integer; m:real;

begin

n:=13;

repeat

n:=n+2; m:=n;

for i:= 2 to 5 do

if (m+1)/i<>trunc((m+1)/i)

then begin n:=n+2; m:=n end

else m:=m-(m+1)/i;

until m=11;

writeln('fish:'n)

end.
我看不懂这俩程序,可以帮我

第一题的算法是做过实验得出的结论----亮着的都是完全平方数.
if i/j=i div j then m:=not(m); --是用来判断i是否是完全平方数;
可以证明:
很容易知,通过奇数次操作的灯亮.
操作的条件是N是最后亮的灯的约数,而约数是成双出现的
若X是最后亮的灯的约数,则最后亮的灯的数字 DIV X 也是最后亮的灯的约数.
除非最后亮的灯的数字是完全平方数,则有一对约数相等.
于是最后亮的灯的约数才可能是奇数.
其实知道规律后,可以更简单--
for i:=1 to trunc(sqrt(n)) do
writeln(i*i,'OPEN');

通过用完全平方数来解题

同意二楼的

差不多啦,从数学上可以证明。
一个数是完全平方数的充要条件是这个数有奇数个约数。
不过,我有一种更简单的判断完全平方数的办法。
假设a是我们要判断的整数,则:
if sqrt(a)=trunc(sqrt(a)) then
writeln(a,"是完全平方数");
这个原理很简单,就是判断它的开根是否是整数,呵呵。