Fortran 消除两个数的倍数
我有一个简单的程序,可以创建一个从1到7的两位数列表: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 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