【问题标题】:Do-loop ignores if-statementDo-loop 忽略 if 语句
【发布时间】:2016-11-28 22:27:40
【问题描述】:

我正在尝试在应该生成素数的 do 循环中使用 if 语句。为此,我使用modulo 来整理数字。在它找到一个素数后,我希望它更进一步并添加 1,以便可以找到下一个素数并将其添加到数组pzahl。我的问题是循环似乎忽略了它应该在找到质数之后更进一步使用plauf,以便它一直持续到无穷大......我试图重新排列循环的内容和if语句但是它只是不工作。这是代码:

PROGRAM Primzahlen

   IMPLICIT NONE

   INTEGER :: start, plauf, n, a
   INTEGER, ALLOCATABLE, DIMENSION(:) :: pzahlen !array into which the  prime numbers should be added
   INTEGER :: input
   INTEGER, DIMENSION(:), ALLOCATABLE :: alle 

   PRINT *, "How many prime numbers should be listed"
   READ (*,*) input
   ALLOCATE (pzahlen(input))
   pzahlen(1) = 1 
   start = 2
   plauf = 1

 loop1: DO 

   ALLOCATE(alle(start))

    loop2: DO n = 1,start
       alle(n)= MODULO(start,n)
    END DO loop2

   IF (minval(alle) /= 0) THEN  ! This is what it seems to ignore.
    plauf= plauf + 1 
    pzahlen(plauf) = start
    PRINT *, plauf
   END IF

  start = start + 1

 IF (plauf == eingabe) then
    EXIT
 END IF
 PRINT *,  alle
 DEALLOCATE(alle)

END DO loop1

PRINT *, "prime numbers:" , pzahlen(1:input)

END PROGRAM Primzahlen 

如果有帮助,我会使用 gfortran 编译器并用 Emacs 编写它。

【问题讨论】:

  • 你不应该结束 DO loop1 吗?
  • END DO loop1 在结尾处。但我不完全确定我是否应该更早使用它。

标签: if-statement fortran do-loops


【解决方案1】:

它没有忽略它,它正确执行:

loop2: DO n = 1,start
   alle(n)= MODULO(start,n)
END DO loop2

start 是什么并不重要,alle(1) 将始终为零,因为每个整数都可以被 1 整除。这意味着 minval(alle) 也将始终为零,这意味着条件 @987654325 @ 永远不会为真,并且该语句永远不会执行。

添加:最后一个值 alle(start) 也将为零,因为每个数字都可以被自己整除。

【讨论】:

  • 感谢您的提示!我已经改变了它,现在它至少工作了一半。虽然还不够完美。
  • 您的代码中有几处是不必要的计算。例如,您总是检查所有个数字,而您可以在第一次匹配后停止。如果在达到目标的平方根时还没有找到除数,则可以停止,因为不会有更大的除数。
  • 我会在 loop2 中添加一个 if 语句来避免这种情况。我刚开始学习 Fortran,所以很高兴你能帮忙:)
猜你喜欢
  • 2023-02-15
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 2020-10-28
  • 2015-08-13
  • 2014-03-04
相关资源
最近更新 更多