-
1
二维数组的输入与输出
program main
implicit none
integer i,j
integer A(2,2)
!
若为
data((A(j,i),i=1,2),j=1,2)/1,2,3,4/
print*,A
end
!
结果为
1
3
2
4
实际为
A(1,1)=1
A(1,2)=2
A(2,1)=3
A(2,2)=4
!
若为
data((A(i,j),i=1,2),j=1,2)/1,2,3,4/
print*,A
end
!
结果为
1
2
3
4
实际为
A(1,1)=1
A(2,1)=2
A(1,2)=3
A(2,2)=4
program main
implicit none
integer i,j
integer A(2,2)
data((A(i,j),i=1,2),j=1,2)/1,2,3,4/
write(*,
end
!
结果为
1
2
3
4
翻卡片
!
用数组编写下面的题目:
假
定有一叠卡片,卡片号为
1
到
52
,并且所有卡片 的正面朝上。从卡片号
2
开始,把凡是偶数
的卡片都翻<
/p>
成正面朝下。再从
3
号卡片开始,把凡是 卡片号为
3
的倍数的卡片都翻一个面(即把正面朝上
的翻
成正面
朝下,正面朝下的翻成正面朝上)
。下一步从< /p>
4
号卡片开始,
把凡是卡片号为
4
的 倍数的卡片都
翻一个面,
依次类推,直到从<
/p>
52
号卡片开始,把凡是卡号为
52
的倍数的卡片翻 一个面。写出一个程序,
来测定全过
程完成后,哪些卡片的面朝上,共有几张。
答
案:正面朝上的卡片是第
1
、
4
、
9
、
16
、
25
、
36
、
49
张,共
7
张。
program main
implicit none
integer s(52)
integer i,j
s=0
do i=2,52
j=i
do while(j<=52)
s(j)=s(j)+1
j=j+i
end do
end do
do i=1,52
if(mod(s(i),2)==0)then
write(*,*)i
end if
end do
end
program main
//
用
C
语言写
#include
int main()
{
int s[52];
int i,j;
for(i=0;i<52;i++)s[i]=0;
for(i=1;i<=51;i++)
{
for(j=i;j<=51;j+=i+1)//
也可以写作
j=j+i+1,
不能写作
j==j+i+1
{
s[j]=s[j]+1;
}
}
斐波拉契
!
使用递归时
result()
不能与函数名相同
PROGRAM MAIN
IMPLICIT NONE
INTEGER n,i,sum
read*,n
if(n<0)THEN
PRINT*,
出错
END IF
write(*,*)'f(n)=',f(n)
do
i=1,n
sum=sum+f(n)
end do
write(*,*)'sum=',sum
contains
recursive function f(n) result(g)
integer g,n
if(n==0)then
g=0
else if(n==.n==2)then
g=1
else
g=f(n-1)+f(n-2)
end if
end function
End
program
分解质因数
!
分解质因数
program
main
implicit none
integer
a,c,i,b
print*,
请输入一个大于二的整数
read*,a
print*,'
则它的所有质因子为
'
do while(a/=1)
i=1
b=1
do while(b/=0)
i=i+1
b=mod(a,i)
c=i
end do
a=a/c
print*,c
end do
end program
哥德巴赫猜想
!<
/p>
屏幕上不能显示
500
行,所以不能将结果完全显示,需要将结果输 入文件
FUNCTION f(i)
IMPLICIT NONE
INTEGER i,f,h
f=0
if(i>1)then
do h=2,i-1
if(mod(i,h)==0)then
f=f+1
endif
end do
endif
end function
program main
implicit none
integer(4)
i,j,n,f
integer s
do n=4,600,2
s=0
j=0
do i=1,n/2-1
j=n-i
if(f(i)==.f(j)==0)then
s=s+1
end if
end do
if(s==0)then
print*,n,'
不满足猜想
'
else
print*,n,s
end if
end do
end program
黄金值法解方程
!将中值法中取中点的值改为取黄金点的值,理论上可以提高效率
module golden_section
implicit none
real a,b,c
contains
subroutine sub1(a,b,c)
real
a,b,c,yc
c=(a*0.618+b)/1.618
yc=f(c)
do
while(abs(yc)>0.00001)
if(yc*f(a)<0)then
b=c
else
a=c
end if
c=(a*0.618+b)/1.618
yc=f(c)
end do
end
subroutine
function f(x)
real f,x
f=x*x-4.0*x+3
end function
end module golden_section
program main
use golden_section
implicit
none
real e
print*,
请输 入解的下界
a
read*,a
print*,
请输入解的上界
b
read*,b
e=f(a)*f(b)
!
用一个循环来判断输入值是否合适,或者就是解
if(f(a)==0)then
print*,a
else if(f(b)==0)then
print*,b
else
do
while(e>0)
print*,
请重新输入下界
a
read*,a
print*,
请重新输入 解的下界
b
read*,b
end do
call sub1(a,b,c)
end if
print*,c
end
回文输出
program main
implicit none
integer i,j
integer a(5),b(5)
data a
/1,2,8,2,10/
data b /2,3,4,5,6/
do i=1,5
do j=1,5
b(j)=b(j)-1
if(b(j)<1)then
b(j)=b(j)+5
end if
end do
print*,a(b(1:5))!
实践证明这是正确的输出方法
end do
end
! fo
rall
语句中不能使用
if
语句
,
但可以用
where
语句,注意()中的内容变化
< p>
但本题从逻辑上就应该先做完
forall,
再做
w here
,故不必嵌套
program main
implicit none
integer i,j
integer a(6),b(6)
DA
TA a /1,4,9,16,25,36/
data b /2,3,4,5,6,7/
do
i=1,6
forall(j=1:6)
b(j)=b(j)-1
end forall
where(b==0)
!
可以写为
where(b(:)==0)
b(:)=b(:)+6
end where
b=b+6
end where
print*,a(b(1:6))!
实践证明这是正确的输出方法
end do
回文数据若干相邻想和并比较大小
!1.
p>
圆盘上有如图
1
(
1
)所示的
20
个数。请找出哪四个相邻的数之和为最大。请指出他们的位
置
和数值。如果是
1
(
2
)图,又是哪四个相邻的数 ?
program main
implicit none
integer
a(20),b(23),c(20)
integer i,j,d,e
data a /20,21,8,4,13,6,10,1
5,2,17,3,19,7,16,8,11,14,9,12,5/
data b
/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,2
0,1,2,3/
do i=1,20
< br>c(i)=a(b(i))+a(b(i+1))+a(b(i+2))+a(b(i+3))
end do
e=1
do i=1,19
if(c(1)
d=c(1)
c(1)=c(i+1)
c(i+1)=d
e=i+1
end if 用 C 语言写,注意 C 的数组从 0 开
始计数,所有的 i 变量减一;嵌套数组仍然有效
int a[20]={20,21,8
,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12,5};
int b[23]={0,1,2,3,4,5,6,7,8,9,
10,11,12,13,14,15,16,17,18,19,0,1,2}; int c[20];
int i,j,d,e;
for(i=0;i<=18;i++)
{
c[i]=a[b[i]]+a[b[i+1]]+a[b[i+2]]+a[b[i+3]];
} e=0;
for(i=0;i<=18;i++)
{ if(c[0] {
d=c[0];
c[0]=c[i+1];
c[i+1]=d; e=i+1;
} } printf( 和最大的是 %d, 这四个数是: n
for(i=e;i<=e+3;i++) printf(
end do
print*,c(1)
write(*,*)(a(b(i)),i=e,e+3)
end
//
#include
int main()
{
return 0;
}