关于对杨辉三角的求和与输出,第一个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(:,:) ! 设置可变大小的数组

  sum = 0
  write(*,*) " 请您输入杨辉三角的边长: "
  read(*,*) length  
  allocate(a(length,length))

  !三角的边缘赋值为1
  do  n = 1, length
    a(n,1) = 1
    a(n,n) = 1
  end do 

  !根据关系求解三角内部的数据
  do n = 2,length-1
    do i = 1,n-1
      a(n+1,i+1)=a(n,i)+a(n,i+1)
      sum = sum + a(n+1,i+1)
    end do 
  end do 
   
   !累加边缘的1
    sum = sum + 2*length-1
    write(*,"('杨辉三角的总和是:',i10)") sum

    write(*,*) "杨辉三角的展开式为:"
   do n = 1,length
      write(*,"(1x,100i5)") (a(n,i),i=1,n)
   end do 

  End
(4)
!这是一个最为诡异的程序
!因为它识别大小写,fortran 不是不识别大小写吗?
integer            n
character        ch
integer     a(2,100)
integer            i,k

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

a(1,1)=1
a(2,1)=1;a(2,2)=1
    i=1
20    write(*,100)(a(1,k),k=1,i)        !输出奇数行的值,依次输出1,3,5,7,......
    i=i+1
!    a(1,1)=1                                                
    do k=2,i                        !计算第三、五、......次输出的数    
        a(1,k)=a(2,k-1)+a(2,k)
    end do
    a(1,i+1)=1
    if(i>n)goto 10

    write(*,100)(a(2,k),k=1,i)        !输出偶数行的值,依次输出2,4,6,8,......
    i=i+1
!    a(2,1)=1                        
    do k=2,i                        !计算第四、六、......次输出的数
        a(2,k)=a(1,k-1)+a(1,k)        
    end do
    a(2,i+1)=1
    if(i<=n)goto 20

10    write(*,*)'是否继续计算?是(y),否(n)。'
    read(*,*)ch
    if(ch=='y')then
        goto 30
    else if(ch=='n')then
        goto 40
    else
        write(*,*)'error,请重新输入!'
        goto 10
    end if
!10    do k=1,0
!    end do
!10    read(*,*)
40    write(*,*)
100 format(1x,100i5)
end