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

对MOD语句或Pascal中FOR循环的误解,pascal,mod,Pascal,Mod,我试着自学帕斯卡,我正在编写一个程序来确定素数。这是粗糙的,不准确的,但只是一个练习。 我已经创建了一个FOR循环,它将查看一个已计数的数字被一组素数除后是否有余数。如果没有,则不被视为素数: begin writeln('This program calculates all the integers below a given number'); writeln('Please enter a number greater than 1'); readln(number);

我试着自学帕斯卡,我正在编写一个程序来确定素数。这是粗糙的,不准确的,但只是一个练习。 我已经创建了一个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。我添加了一个计数打印,以查看循环是否正常工作,而且似乎正常。有什么建议吗


提前谢谢

变量
prime
在进入循环之前设置为true。 在循环内部,当count为1时,不会再次设置prime变量,因此它将打印true

换言之:

1 mod 2 equals 1
1 mod 3 equals 1
1 mod 5 equals 1
1 mod 7 equals 1
因为这两条语句都不等于零,所以prime变量的初始真值不会改变


如果您想使用素数列表测试一个数是否为素数,那么应该从素数列表中迭代

下面是一个简单的测试

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;
procedure TestIsPrime(数字:整数);
常数
//带素数的循环表。扩展以覆盖更大的范围。
素数:整数=(2,3,5,7)的数组[1..4];
变量
计数:整数;
最高:整数;
IsPrime:布尔;
开始
if(数字1;//1是一个特例!!
如果(数字>=Sqr(素数[高(素数)]),则开始
WriteLn('表中需要更多的素数才能测试:',编号);
出口
结束;
highTest:=Trunc(Sqrt(number));//要测试的最高数字
对于计数:=1到高(素数)不开始
如果(最高>=素数[计数]),则开始
如果(数模素数[计数]=0),则开始
IsPrime:=假;
打破
结束;
结束
其他的
打破
结束;
如果IsPrime=true,则WriteLn(数字);
结束;

变量
prime
在进入循环之前设置为true。 在循环内部,当count为1时,不会再次设置prime变量,因此它将打印true

换言之:

1 mod 2 equals 1
1 mod 3 equals 1
1 mod 5 equals 1
1 mod 7 equals 1
因为这两条语句都不等于零,所以prime变量的初始真值不会改变


如果您想使用素数列表测试一个数是否为素数,那么应该从素数列表中迭代

下面是一个简单的测试

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;
procedure TestIsPrime(数字:整数);
常数
//带素数的循环表。扩展以覆盖更大的范围。
素数:整数=(2,3,5,7)的数组[1..4];
变量
计数:整数;
最高:整数;
IsPrime:布尔;
开始
if(数字1;//1是一个特例!!
如果(数字>=Sqr(素数[高(素数)]),则开始
WriteLn('表中需要更多的素数才能测试:',编号);
出口
结束;
highTest:=Trunc(Sqrt(number));//要测试的最高数字
对于计数:=1到高(素数)不开始
如果(最高>=素数[计数]),则开始
如果(数模素数[计数]=0),则开始
IsPrime:=假;
打破
结束;
结束
其他的
打破
结束;
如果IsPrime=true,则WriteLn(数字);
结束;

请发布整个程序。在您当前的代码中,缺少
number
的声明。您应该使用调试器逐步检查您的程序,以了解它的实际功能。有一篇很棒的文章叫做“如何调试小程序”这将帮助您找到错误。@Roland:也就是说,对于不习惯调试的人来说,这很有趣,但它并没有真正说明如何在Pascal中进行调试。根据Pascal的版本,这可能会有很大的不同。素数是大于1的整数,其唯一的因子是1和它本身。那么为什么要测试1是否为1素数?谢谢你的评论!我很感谢关于调试的讨论链接。我当然需要学习一些东西。请发布整个程序。在你当前的代码中,缺少
number
的声明。你应该使用调试器逐步检查你的程序,看看它到底做了什么。有一篇很棒的文章“如何调试小程序”这将帮助您找到错误。@Roland:也就是说,对于不习惯调试的人来说,这很有趣,但它并没有真正说明如何在Pascal中进行调试。根据Pascal的版本,这可能会有很大的不同。素数是大于1的整数,其唯一的因子是1和它本身。那么为什么要测试1是否为1素数?感谢所有的评论!我很感谢关于调试的讨论的链接。我当然需要学习一些东西。感谢这一课。换句话说,因为我在循环外将布尔定义为true,“1”作为true通过循环,因为它总是有一个余数。当“2”通过,当除以2时,它显然没有余数,将布尔值设置为“False”,在FOR计数的其余部分,它始终保持为“False”,因为“true”重置在FOR语句之外。对吗?感谢您提供的代码,我将把它添加到我的编程学习中。(数组是本书的下一章!)是的,逐行学习代码是一个很好的课程。如果你想找到给定数字以下的所有素数,请从2开始,因为根据定义1不是素数。不要用等于或大于计数的素数来测试计数。感谢这一课。换句话说,因为我将布尔值定义为true在循环外,“1”作为真值通过循环,因为它总是有一个余数。当“2”通过循环时,当除以2时,它显然没有余数,将布尔值设置为“False”,在FOR计数的其余部分,它始终保持为“False”,因为“true”重置不在FOR语句的范围内。是否正确?感谢您提供的代码,我将把它添加到我的编程学习中。(数组是本书的下一章!)是的,逐行遍历代码是一个很好的学习课程。如果您想找到所有的prime nu