我想用Fortran解决以下类型的给定方程式:
1 ? 2 ? 3 = 7
在这个等式中,只有算术运算符丢失,第一个问号的解决方案为“+”,第二个问号的解决方案为“*”。我想写一个简短的脚本,通过暴力找到正确的操作符。所以在这种情况下,必须检查四次四个案例。为了做到这一点,我想将运算符存储在一个数组中,并在嵌套的do循环中使用它们:
value1=1
value2=2
value3=3
result=7
op(1)=+
op(2)=-
op(3)=/
op(4)=*
do i=1,4
do j=1,4
if(value1 op(i) value2 op(j) value3 .eq. result) then
write(*,*)'Found solution: ' ,op(i), op(j)
else
j=j+1
endif
enddo
i=i+1
enddo
显然,由于if语句的错误解释,这不起作用。任何想法如何使这项工作?
答案 0 :(得分:4)
作为Vladimir pointed out,你不能在Fortran中直接这样做,除非你使用函数指针。下面你会找到一个例子。
我通过仅使用整数运算使其变得简单。还要注意,我假设表达式中的操作是从左到右执行的(没有优先级规则),否则算法会复杂得多。如果优先级很重要,那么你应该考虑为任务使用解释语言(除非执行速度很小)。
这是定义操作的模块和包含过程指针的类型:
module myfuncs
implicit none
abstract interface
function binary(i1, i2)
integer, intent(in) :: i1, i2
integer :: binary
end function binary
end interface
type :: procptr
procedure(binary), pointer, nopass :: ptr
end type procptr
contains
function add(i1, i2) result(res)
integer, intent(in) :: i1, i2
integer :: res
res = i1 + i2
end function add
function mul(i1, i2) result(res)
integer, intent(in) :: i1, i2
integer :: res
res = i1 * i2
end function mul
function sub(i1, i2) result(res)
integer, intent(in) :: i1, i2
integer :: res
res = i1 - i2
end function sub
function div(i1, i2) result(res)
integer, intent(in) :: i1, i2
integer :: res
res = i1 / i2
end function div
end module myfuncs
以下是强力搜索的主程序:
program bruteforce
use myfuncs
type(procptr) :: ops(4)
character :: opnames(4)
integer :: val1, val2, val3, res, myres
val1 = 1
val2 = 2
val3 = 3
res = 7
ops(1)%ptr => add
ops(2)%ptr => sub
ops(3)%ptr => mul
ops(4)%ptr => div
opnames = [ "+", "-", "*", "/" ]
lpi: do ii = 1, 4
lpj: do jj = 1, 4
myres = ops(jj)%ptr(ops(ii)%ptr(val1, val2), val3)
write(*,"(3(I0,1X,A,1X),I0)") val1, opnames(ii), val2, &
&opnames(jj), val3, " = ", myres
if (myres == res) then
write(*,*) "Solution found."
exit lpi
end if
end do lpj
end do lpi
end program bruteforce
答案 1 :(得分:1)
这不能在Fortran中完成。您为op
声明了哪种类型?没有任何合适的东西。你可以做的一件事是定义一些函数并存储函数指针。