Недоразумение относительно операторов MOD или циклов FOR в Паскале - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь научить себя Паскалю и собираю программу для определения простых чисел.Это грубо и неточно, но просто упражнение.Я создал цикл 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 Ответ

2 голосов
/ 14 марта 2019

Ваша переменная 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;
...