注意我的注释(重点解释while一段)——
首先:判断质数的标准是,某一个数被2~该数自身平方根(取整数)一各个相除,如果被除尽了,则立即判断不是质数。否则就是质数。
while
(k<=sqrt(j))
and
not(f)
do
判断k是达到了该数的平方根,因为范围在2~2~该数自身平方根内;同时判断这些数字被j除,有没有除尽(f在这里是一个布尔类型的判断符号,默认是没有除尽,表示还可以继续循环)。
begin
if
trunc(j/k)=j/k
then
f:=true
没有除尽肯定j/k是有余数的,trunc是取整数。如果两者相等,表示没有余数(除尽了),那么显然这个数字就不是质数了,把f设置成true。那么not(f),对ture取反就是false,那么打破循环推出,之后的zs:=not(f);
也就是对标识符取反——not(true):false,表示不是质数。
else
k:=k+1;
end;
f是逻辑(布尔)变量,其值只有true和false两个,not()是库函数,其返回值是函数参数的求反结果,如
not(ture)
=
false,not(false)
=
true。
*******************************************************************************************************************************
function
zs(j:integer):boolean;
//
函数zs的形参为整形变量j,返回值ture说明j为质数,false说明j为和数。
var
k:integer;
f:boolean;
begin
f:=false;
//
假定j为质数
k:=2;
// 从最小质数2开始去除
while
(k<=sqrt(j))
and
not(f)
do
//
这句应该这样的while
((k<=sqrt(j))
and
not(f))
do
begin
if
trunc(j/k)=j/k
then
f:=true
//
如果j能被k整除,说明j为和数。
else
k:=k+1;
end;
zs:=not(f);
//
只要能被任意的k值整除,则f
=
ture,not(f)
=
false,就是说j为和数,反之,j为质数。
end;