消除几个数字的倍数

时间:2014-03-30 10:44:10

标签: fortran fortran90

我有这个简单的程序,可以创建一个从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的倍数?

3 个答案:

答案 0 :(得分:1)

如果任一数字可以采用的最大值为7,则应该起作用:

  1. 使用分母5040将每对数字重写为有理数。我把它留作练习来弄清楚为什么选择这个分母。因此(2,3)将成为3360/5040。当然,由于数字有一个共同点,你不需要存储它。
  2. 现在你有一个从你的对列表到整数列表的映射;所有与您的规则等效的对( (1,2),(2,4),(3,6), ...)映射到相同的整数(在本例中为2520)。
  3. 有多种方法可以使用这个整数列表来编写循环,只打印映射到它的对中的一对。
  4. 这应该足以让你入门。如果您在将此问题转化为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),那么这不是很有效,即发生的第一对。但我希望你也能适应这种情况。