ocl中最大的公约数

时间:2016-06-16 14:20:49

标签: greatest-common-divisor ocl

如何编写一个操作gcd(x : Integer, y : Integer) : Integer,它返回ocl中两个正整数的最大公约数(两个正整数除以最大的整数)?

1 个答案:

答案 0 :(得分:0)

这是一个简单的解决方案(当然没有效果,但它有效):

let divs : Sequence(Integer) = if x < y then Sequence{1..y} else Sequence{1..x} endif
in divs->select(z | x.mod(z) = 0 and y.mod(z) = 0)->last()

简单地完成了生成每个候选电位的序列,然后,从该序列中,仅选择划分xy的序列并将其存储在新序列中(订购)。最后,此过滤序列中的最后一个数字是您最常见的除数。

现在详细说明:

  1. 我们生成一个Sequence{a..b}
  2. 的序列
  3. 此序列从1转到xy之间的较高数字(if x < y then Sequence{1..y} else Sequence{1..x}
  4. 此序列存储在不可变变量divslet divs : Sequence(Integer) = ... in ...
  5. 来自divs,我们只选择z作为xz divs->select(z | x.mod(z) = 0 and y.mod(z) = 0)select(...)->last()
  6. 的除数的last()
  7. 最后,我们只从新序列(->sortedBy(i | -i)->at(1)
  8. 中取出最后一个元素

    如果你的env中不存在last()函数(不知道为什么,但有些OCL实现带来了自己的函数),你可以使用:

    let divs : Sequence(Integer) = Sequence{1..x.max(y)}
    in divs->select(z | x.mod(z) = 0 and y.mod(z) = 0)->last()
    

    而不是divs,它反转序列并取第一个元素。

    <强>编辑&gt;

    您也可以通过这种方式减少表达式:

    Sequence{1..x.max(y)}->select(z | x.mod(z) = 0 and y.mod(z) = 0)->last()
    

    或删除使用musik /media/sf_musik/ vboxsf defaults,_netdev,uid=1000,gid=1000,rw,fmode=0644,dmode=0750 0 0 filme /media/sf_filme/ vboxsf defaults,_netdev,uid=1000,gid=1000,rw,fmode=0644,dmode=0750 0 0

    LEFT JOIN