プログラム例3

      SOSUU = .TRUE.
        DO 10 I=2,N-1
          IF (MOD(N,I).EQ.0) SOSUU=.FALSE.
   10   CONTINUE

プログラム例3(改良)

      SOSUU = .TRUE.
      M = INT(SQRT(REAL(N)))
        DO 10 I=2,M
          IF (MOD(N,I).EQ.0) SOSUU=.FALSE.
   10   CONTINUE

プログラム例3(さらに改良)

      SOSUU = .TRUE.
      M = INT(SQRT(REAL(N)))
        DO 10 I=2,M
          IF (MOD(N,I).EQ.0) THEN
              SOSUU=.FALSE.
              GOTO 20
          ENDIF
   10   CONTINUE
   20 END

プログラム例3(〜Nまでの素数を求める,その1)

        DO 10 I=2,N
          M=INT(SQRT(REAL(I)))
            DO 20 J=2,M
              IF (MOD(I,J).EQ.0) GOTO 10
   20       CONTINUE
          WRITE (*,*) I
   10   CONTINUE

注:このプログラムの場合,IがJで割り切れたときにDOループから強制的に飛び出している.
  場合によってはこれが変な動作の原因になりかねないので,以下では条件分岐で書き直してみた.
  (C言語であればbreakが使える.)

プログラム例3(〜Nまでの素数を求める,その2)

      I=1
   10   I=I+1
            IF (I.GT.N) GOTO 50
          M=INT(SQRT(REAL(I)))
          J=1
   20       J=J+1
                IF(J.GT.M) GOTO 30
                IF(MOD(I,J).EQ.0) THEN
                    GOTO 40
                  ELSE
                    GOTO 20
                ENDIF
   30     WRITE(*,*) I
   40   GOTO 10
   50 END

プログラム例4(エラトステネスのふるい)

      INTEGER A(10000)
        DO 10 I=1,N
          A(I)=1
   10   CONTINUE
        DO 20 I=2,N
          IF (A(I).EQ.1) THEN
              WRITE(*,*) I
                DO 30 K=2*I,N,I
                  A(K)=0
   30           CONTINUE
          ENDIF
   20   CONTINUE


<戻る>