我是一名物理学家,最近我一直在和Fortran合作.最初我使用Java进行广泛的娱乐,因为它是我学习的第一种语言,但我已经放弃了它用于Fortran和C++.我对素数有业余热情,因此我创建了一个素数筛子.我能够在15秒内找到最多2 ^ 31的所有素数.这是Java的最大数组大小,所以这就是结束.我小心地移植了代码(我的意思是,我很沮丧,我的代码很慢,而且我找不到错误,我将我的Fortran代码移植回Java以验证它不是我的错,然后移植回来到Fortran,擦除每次迭代!).问题是大约800,000,000 Fortran将陷入停顿.到目前为止,它击败了Java,但在此之后,它的速度非常慢.我花了几个小时绘制它并拟合曲线.它以指数方式减速,可能需要数百年才能解决Javas级别问题.我问过很多人无济于事.为什么这发生在我身上?!?!有没有明智的Fortran程序员可以帮助我?我正在运行Macbook Pro 2013年末i5.我的代码如下.
program sieve
integer(4),allocatable:: prime(:)
integer(4)::a,max,b,primeCount
write(*,*)"Welcome to the slow prime number sieve!"
write(*,*)"--------------------------------------------"
write(*,*)"Up to what numbers do you need to find primes for?"
write(*,*)"Enter a number below 2^(32-1)"
read*, max
primeCount=0
allocate(prime(max))
prime(1)=1
do a=2,int(sqrt(real(max))) !the main loop
if(prime(a)==0)then !if the number is marked as prime procede
do b=2*a,max,a !eliminate all the numbers that are multiples of the number
if(prime(b)==0)then !but only spend time eliminating if the number is still marked prime
prime(b)=1 …Run Code Online (Sandbox Code Playgroud)