对Pascal中MOD语句或FOR循环的误解

时间:2019-03-14 06:29:15

标签: pascal mod

我正在尝试自学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。我添加了一个计数打印,以查看循环是否正常工作,而且看起来确实如此。有提示吗?

谢谢!

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;