我有这个简单的程序,可以创建一个从1到7的两位数字列表:
1 1
1 2
1 3
1 4
...
等等。
我想要的条件很复杂,因为我想要排除两个数字的倍数:如果我有1,2打印,我也不想要2,4。等等。
f90程序非常简单:
program multiple
implicit none
integer :: i,j
i=0
j=0
do i= 1,7
do j =1,7
print*, i,j
end do
end do
end program
问题是:我必须实施哪些IF
(或其他标准)来消除表格的数字:
2 4
2 6
3 6
是1,2 ; 1,3 ; 1,2
的倍数?
答案 0 :(得分:1)
如果任一数字可以采用的最大值为7
,则应该起作用:
5040
将每对数字重写为有理数。我把它留作练习来弄清楚为什么选择这个分母。因此(2,3)
将成为3360/5040
。当然,由于数字有一个共同点,你不需要存储它。(1,2),(2,4),(3,6), ...
)映射到相同的整数(在本例中为2520
)。这应该足以让你入门。如果您在将此问题转化为Fortran时遇到问题,请以最佳方式更新您的问题,我(或其他人)将帮助您完成该问题。
答案 1 :(得分:0)
我对具体细节并不完全清楚,但只是显示一般情况就足够了。
简单来说,i
是您的“外部循环”和第一个数字,j
是您的“内部循环”和第二个数字。如果您想跳过包含特定第二个数字的对,if
会绕过print statement
。如果你想跳过包含特定第一个数字的对,if
绕过内循环。
但,如果索引不是你的目标值,你想跳过循环。
要查看程序中的两者(2,5,3和6可以是任何数字):
do i= 1,7
if i /= 2 .and. i /=5 then
do j =1,7
if j /= 3 .then. j /= 6 then
print*, i,j
end if
end do
end if
end do
因此,在这种情况下,当j
不是2或5时,你只会执行i
循环。当你执行内循环时,它只会在{{1}时打印}不是3或6。
答案 2 :(得分:0)
另一种方法是声明一个逻辑数组,例如
logical, dimension(7,7) :: found
将每个元素设置为.false.
。然后阅读你的数字对列表。当您遇到(2,4)
这样的对时,首先会减少它所代表的分数(即到(1,2)
),然后将found
的相应元素设置为{ {1}}。
在运行整数对列表后,数组.true.
恰好包含found
,其索引是您要查找的对。
如果您的列表包含.true.
和(2,4)
但不包含(3,6)
而您的所需输出为(1,2)
,那么这不是很有效,即发生的第一对。但我希望你也能适应这种情况。