我正在尝试自学Pascal,并正在制定一个确定素数的程序。这是粗略且不准确的,但只是练习。 我创建了一个FOR循环,该循环将查看被除以一组质数的计数是否具有余数。如果不是,则不认为是素数:
begin
writeln('This program calculates all the integers below a given number');
writeln('Please enter a number greater than 1');
readln(number);
//Need code to deal with entries that equal 1 or less, or aren't integers
prime:=true;
if number >=2 then writeln(2);
if number >=3 then writeln(3);
if number >=5 then writeln(5);
if number >11 then writeln(7);
For count := 1 to number do
begin
if count MOD 2 = 0 then prime:=false;
if count MOD 3 = 0 then prime:=false;
if count MOD 5 = 0 then prime:=false;
if count MOD 7 = 0 then prime:=false;
if prime = true then writeln(count);
writeln ('count= ',count)
end;
writeln('Hit any key to continue');
readln();
end.
但是,无论我输入什么数字,For循环都将素数打印为1。我添加了一个计数打印,以查看循环是否正常工作,而且看起来确实如此。有提示吗?
谢谢!
答案 0 :(得分:2)
您的变量prime
在进入循环之前已设置为true。
在循环内部,当count为1时,不会再次设置质数变量,因此它将输出true。
换句话说:
1 mod 2 equals 1
1 mod 3 equals 1
1 mod 5 equals 1
1 mod 7 equals 1
由于这两个语句都不为零,因此素数变量的初始真实值不变。
如果要使用质数列表测试数字是否为质数,则应从质数列表进行迭代。
这是一个简单的测试。
procedure TestIsPrime( number : Integer);
const
// A loopup table with primes. Expand to cover a larger range.
primes : array[1..4] of Integer = (2,3,5,7);
var
count : Integer;
highTest : Integer;
IsPrime : Boolean;
begin
if (number <= 0) then begin
WriteLn('Illegal number: ',number);
Exit;
end;
IsPrime := number > 1; // 1 is a special case !!
if (number >= Sqr(primes[High(primes)])) then begin
WriteLn('Needs more primes in table to test: ',number);
Exit;
end;
highTest := Trunc(Sqrt(number)); // Highest number to test
for count := 1 to High(primes) do begin
if (highTest >= primes[count]) then begin
if (number MOD primes[count] = 0) then begin
IsPrime := false;
Break;
end;
end
else
Break;
end;
if IsPrime = true then WriteLn(number);
end;