我的Fortran程序存在问题,除了计算素数分解(或者应该这样做)之外什么也没做。那就是错误:
C:\MinGW\Fortran>gfortran aufg3.f90
aufg3.f90:15.15:
if (prim(i) != 0 .and. modulo(n, prim(i)) == 0) then
1
Error: Missing ')' in statement at or before (1)
aufg3.f90:19.7:
end if
1
Error: Expecting END DO statement at (1)
aufg3.f90:34.13:
if (prim(i) != 0) then
1
Error: Missing ')' in statement at or before (1)
aufg3.f90:38.5:
end if
1
Error: Expecting END DO statement at (1)
我尝试了一切,但完全不知道出了什么问题。谢谢你的帮助。这是代码:
program aufg3
implicit none
integer :: n, i
integer, allocatable, dimension(:) :: prim
do
print *, 'Bitte natürliche Zahl eingeben, "0" für Abbruch: '
read *, n
if (n == 0) exit
allocate(prim(2:n))
call era(prim, n)
print *, n, ' = 1'
do
if (n == 1) exit
do i = 2, n
if (prim(i) != 0 .and. modulo(n, prim(i)) == 0) then
print *, ' * ', prim(i)
n = n / prim(i)
exit
end if
end do
end do
deallocate(prim)
end do
end program
subroutine era(prim, m)
integer, intent(in) :: m
integer, dimension(2:m) :: prim
integer :: i, j
do i = 2, m
prim(i) = i
end do
do i = 2, integer(sqrt(real(m)))
if (prim(i) != 0) then
do j = i*i, m, i
prim(j) = 0
end do
end if
end do
end subroutine
答案 0 :(得分:6)
嗯,这是Fortran,if (prim(i)
表示评论。所以编译器实际上看到了
/=
这是无效的声明。您看到的错误消息反映了这一点。
Fortran中的“不相等”是.ne.
或 if (prim(i) /= 0 .and. modulo(n, prim(i)) == 0) then
:
if (prim(i) /= 0) then
以及稍后:
PARSE_IP('64.233.160.0') returns 1089052672
答案 1 :(得分:3)
您使用错误的符号表示'不等于'。 Fortran语法为/=
或.NE.
。
所以你应该使用:
if (prim(i) /= 0 .and. modulo(n, prim(i)) == 0) then
和
if (prim(i) /= 0) then
此外,您的integer(sqrt(real(m)))
语法不正确,也许您的意思是NINT(sqrt(real(m)))
?
答案 2 :(得分:2)
"令牌不等于"在fortran是/ =。 !开始注释,因此编译器将第15行读为
if (prim(i)
因为没有括号来关闭if语句中的逻辑表达式而感到困惑。所以简单地用!=替换!=它应该摆脱这个问题。