当前位置: 代码迷 >> 其他开发语言 >> 杨辉三角 Fortran编译模式总结
  详细解决方案

杨辉三角 Fortran编译模式总结

热度:7819   发布时间:2013-02-26 00:00:00.0
杨辉三角 Fortran编译方式总结
楼主
关于对杨辉三角的求和与输出,第一个if语句,就完成了复制和运算,简单高效,缺点就是和(3)一样,占用了较大内存,而(3)属于正常的思路,浅显易懂;而(2)和(4)呢,都是只设置了2*(n+2)维数组,节约了内存,加快了计算时间。但是(4)可以循环使用,故而设置可变大小的数组就有点问题,所以放弃了使用allocate的方法。
    至于数据的输出,4个例子大同小异,都是采用隐式循环的输出,但并不是按照变量的存储位置来输出的,较为缓慢。
(1)
program main
implicit none
integer i,j,n,sum
integer,allocatable ::  a(:,:)

sum = 0
write(*,*)"请输入要打印的行数:"
read(*,*)n
allocate(a(n,n))
 write(*,*) "杨辉三角的展开式为:"
do i=1,n

  do j=1,i

     if(j==1.or.j==i)then
       a(i,j)=1
       sum = sum +a(i,j)
     else
       a(i,j)=a(i-1,j-1)+a(i-1,j)
       sum = sum +a(i,j)
     end if

    end do
  
 
  write(*,'(100i5)')(a(i,j),j=1,i)
    end do
write(*,"('杨辉三角的总和是:',i10)") sum

end 
(2)
!计算的速度是最快的
!只需要一个2*(n+2)的数组即可,计算杨辉三角最为节省内存的方式
program main
implicit none 
integer  n,sum,minus
integer,allocatable :: a(:,:)
integer      i,k
sum = 0
minus = 0

write(*,*)'请输入需要打印杨辉三角的行数:'
read(*,*)n
allocate(a(2,n+2))

!复制 为1
a(1,1)=1
a(2,1)=1;a(2,2)=1

 do i=1,n/2
    write(*,100)(a(1,k),k=1,2*i-1)
    write(*,100)(a(2,k),k=1,2*i)

! 处理a(1,:)的所有数据                    !注意:这里已经求出了下一次打印的数组,
    do k=2,2*i                            !而退出循环时这两行数并未打印呢
        a(1,k)=a(2,k-1)+a(2,k)
        sum = sum + a(1,k)
    end do
    a(1,2*i+1)=1

!  处理a(2,:)的所有数据
    do k=2,2*i+1
        a(2,k)=a(1,k-1)+a(1,k)
        sum = sum+a(2,k)
     end do
       a(2,2*i+2)=1

 end do

!如果是奇数,则打印第n行,a(1,:)
!按n的奇数还是偶数计算多余的数据
if(mod(n,2)==1)then
    write(*,100)(a(1,k),k=1,n) 
    do i=1,n
     minus = minus +a(2,i)
    end do 
 else 
    do i=1,n+1
      minus = minus +a(1,i)
    end do 
    do i=1,n+2
     minus = minus +a(2,i)
    end do 
end if

   !减去多余的数据以及加上未加的数据
   sum = sum-minus+3+2*n
   write(*,"('杨辉三角的总和是:',i10)") sum

100 format(1x,100i5)

end
(3)
  !计算给定的杨辉三角的和
  
  program main 
  implicit none 
  integer n,i,length,sum
  integer,allocatable :: a(:,:) ! 设置可变大小的数组