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