主题:杨辉三角 vf编译方式总结
关于对杨辉三角的求和与输出,第一个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
至于数据的输出,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