Fortran 消除两个数的倍数

Fortran 消除两个数的倍数,fortran,fortran90,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 问题是:如果(或其他标

我有一个简单的程序,可以创建一个从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  
问题是:如果(或其他标准)我必须实现什么来消除表单中的数字:

2 4
2 6
3 6

这是
1,2的倍数;1,3 ; 1,2

我不完全清楚细节,但它足够简单,只显示一般情况

简单来说,
i
是你的“外环”和第一个数字,
j
是你的“内环”和第二个数字。如果要跳过包含特定第二个数字的对,则
If
会绕过
print语句。如果要跳过包含特定第一个数字的对,则
If
将绕过内部循环

但是,如果索引不是您的目标值,您希望跳过循环

要查看程序中两者的外观(2、5、3和6可以是任意数字):


因此,在本例中,仅当
i
不是2或5时才执行
j
循环。当您执行内部循环时,仅当
j
不是3或6时,它才会打印。

如果任意一个数字可以取的最大值是
7
,这应该可以工作:

  • 将每对数字重写为分母为5040的有理数。我把它作为一个练习来理解为什么我选择了那个分母。所以
    (2,3)
    将变成
    3360/5040
    。当然,因为数字有一个共同的分母,你不需要存储它
  • 现在你有了一个从对列表到整数列表的映射;根据您的规则等价的所有对(即
    (1,2)、(2,4)、(3,6),…
    )映射到同一个整数(在本例中为
    2520
  • 有多种方法可以使用这个整数列表来编写循环,以便只打印映射到它的一对

  • 这应该足以让你开始。如果您在将其转换为Fortran时遇到问题,请尽最大努力更新您的问题,我(或其他人)将帮助您完成它。

    另一种方法是声明一个逻辑数组,例如

    logical, dimension(7,7) :: found
    
    将每个元素设置为
    .false.
    。然后阅读你的成对数字列表。当你遇到像
    (2,4)
    这样的一对时,你首先减少它所代表的分数(即减少到
    (1,2)
    ),然后你将
    找到的
    的相应元素设置为
    真。

    运行一次整数对列表后,发现数组
    包含
    .true.
    正好位于索引为您要查找的整数对的位置


    如果您的列表包含,比如说,
    (2,4)
    (3,6)
    ,但不包含
    (1,2)
    ,并且您希望的输出是
    (2,4)
    ,这是出现的第一对。但我希望你也能适应这种情况。

    到目前为止你尝试了什么?@John C感谢你的提示,但我想你的代码只排除了第一和第二周期中的数字。我的条件有点复杂,因为我想排除两个数字的倍数:如果我打印了1,2,我不想要2,4。依此类推。在这种情况下,您需要第二个
    if
    来测试
    i
    j
    的值。记住,你也会做数学。哦,我在Fortran 90上找到了一个很好的例子,可能会有所帮助。是的,我看到了笔记,但对我帮助不大。是的,i和j上的条件必须是一个数学条件,类似于
    if(i/j.ne.m*(i/j)),那么
    在这种情况下,我必须使用另一个索引来计算数字的多重性:
    m
    -乘以i/j。您如何知道
    i
    的当前值是某些
    n
    的倍数?是的,这是因为
    n*
    一些数字
    .eq。i
    ,但相反的
    i/n
    也很有用。(有一个内置函数可以解决这个问题,但我不知道它是否允许。)
    logical, dimension(7,7) :: found