【问题标题】:Implementing Egyptian Algorithm in java在java中实现埃及算法
【发布时间】:2012-10-22 02:54:02
【问题描述】:

我想在 Java 中递归地找到两个数字的乘法,只使用加法、减法和比较。所以,我google了一下,发现Egyptian Algorithm符合问题要求。

但是,我不确定在到达base case 后如何找到乘法结果。

例子:

13 x  30

1  -- 30

2  -- 60

4  -- 120

8  -- 240 //we stop here because the double of 8 is larger than 13

为了找到结果,我们将等于 13 的 left column 中的数字相加,它们是 1+4+8,另一方面,我们从 right column 中添加相反的数字,它们是 30+120+240 = 390,这是结果.

但是现在如何以编程方式完成最后一部分?如何检查要添加的数字?我希望你们明白我的意思。只需要提示。

【问题讨论】:

  • 你有没有试过自己做这个?有代码sn-ps吗?
  • 我实际上是在问问题的最后一部分。不是如何编码整个算法。我将在几分钟内发布我的代码。
  • 好的 - 对于问题的最后一部分,您尝试了什么?
  • 告诉我们您尝试了什么以及答案如何解决了您的问题

标签: java algorithm data-structures recursion multiplication


【解决方案1】:

循环遍历创建的结果以相反的顺序

每次,如果您的乘数余数(开始等于您的乘数)大于左列中的数字,请从乘数中减去左列,然后将右列添加到结果中(从零开始)。

【讨论】:

    【解决方案2】:

    你可能已经找到了这个维基百科article

    看一下“分解”部分的最后一部分。您会找到必须实施的子算法。

    【讨论】:

    • 我能想到的实现分解的唯一方法是 for loops 。但我认为它会很慢而且成本太高。 for loops 的倍数和递归调用。而且我仍然不知道它将如何帮助我找到powers 以找到最后一个结果。我明天继续。
    【解决方案3】:

    下面是解决问题的伪代码:

    function egyptian(left, right)
      prod := 0
      while (left > 0)
        if (left is odd)
          prod := prod + right
        left := halve(left)
        right := double(right)
      return prod
    

    基本上,与其等到最后,不如在创建模板时检查模板的每一行并对其是否属于输出进行求和。我在my blog 讨论这个算法。

    【讨论】:

    • 能否也给出减半函数的伪代码?我无法弄清楚如何仅使用可用的操作来完成。
    • 另外,is odd 使用给定的操作也是有问题的。
    • 古埃及人使用成对的鹅卵石。你也可以做到的。将一个数字减半,取一个丢掉一个,取一个丢一个,取一个丢一个,以此类推,直到一个也没有;您保留的鹅卵石是原始数量的一半。判断一个数字是否为奇数是类似的:反复拿一个扔掉一个,直到没有一个或只剩下一个小石子,这会告诉你这个数字是偶数还是奇数。
    • 好点,我没有意识到这些选项,它们确实使之成为可能。它并没有使算法特别有吸引力,因为它变成了O(log(n)^2),而 OP 目前正在处理的算法是O(log(n))
    【解决方案4】:

    好的,我使用蛮力算法做到了。不过,这是一个 BigO-(n)。我确信有更有效的方法来实现它。目前。我正在解决这个问题。

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 2019-04-02
      • 2011-02-12
      • 2011-12-10
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 2022-11-20
      相关资源
      最近更新 更多