У меня есть следующий код:
PROGRAM PEU72
USE PRIMES
IMPLICIT NONE
INTEGER, PARAMETER :: MYKIND = SELECTED_INT_KIND(16)
INTEGER (KIND=MYKIND) :: SOFAR
INTEGER :: NRP, M
SOFAR = 0_MYKIND
CALL GEN(ALLNUMS,ALLPRIMES) ! This is a call to a module that creates a list of primes. It works fine.
DO M = 2,8 ! When I try to compile in G95, this loop doesn't increment. M = 2 for each cycle.
SOFAR = SOFAR + NRP(M)
END DO
PRINT *,'ANS: ',SOFAR
READ *,SOFAR
END PROGRAM PEU72
FUNCTION NRP(NUM) RESULT(PHI)
USE PRIMES
IMPLICIT NONE
INTEGER :: NUM, PHI, I!, DIF
INTEGER :: VAR
I = 1
PHI = NUM-1
VAR = NUM
DO
IF (MOD(NUM,ALLPRIMES(I))==0) THEN
PHI = PHI-((NUM-1)/ALLPRIMES(I))
NUM = NUM/ALLPRIMES(I) ! This is the line that silverfrost doesn't like. The code works absolutely fine without it, it just takes too long.
END IF
I = I + 1
VAR = NUM-ALLPRIMES(I)
IF (VAR<0) THEN
EXIT
END IF
END DO
RETURN
END FUNCTION
В целях оптимизации я хочу разделить num, критерий цикла while, каждую итерацию. Мой (silverfrost) компилятор выдает ошибку (активный цикл DO изменен), когда я делаю это, и компилятор G95
полностью разрывается, вообще не повторяя первый цикл. Я пытался использовать терминологию DO - IF - EXIT, ни одна из них не работает. Как мне добиться ситуации, когда Num делится каждый раз, а Allprimes (i) увеличивается?