请高手解释一下这个PASCAL程序

来源:百度知道 编辑:UC知道 时间:2024/06/14 18:59:11
program a;
var
a,b,c,i:integer;
begin
for a:=2 to 1000 do
begin
b:=1;
for i:=2 to a div 2 do
if a mod i=0
then b:=b+i;
c:=1;
for i:=2 to b div 2 do{这句话中 b 是a的因数和 为什么要用b div 2来写?第二个数的因数和一定小于第一个数的因数和吗?请帮我解释 谢谢}
if b mod i=0
then c:=c+i;
if (a=c) and (a<>b)
then writeln(a,b)
end
end.

讲会了追加25分

一个数的因数不会超过这个数的一半,例如100,它的约数有,1,2,4,5,10,20,25,50(不含100);这些数中,最大的不会超过50。你可以这样分析,100/100等于1,则他最大的约数100/50等于2。所以100最大的约数不会超过100 Div 2。
在举一例:99,他最大的约数33,可得99/33等于3,也没有超过99 Div 2=49
所以他只要找1 to a div 2 的数就可以了,而a div 2+1 to n-1 中绝对没有没有它的约数,所以没有必要再去循环了