繁体   English   中英

使用 Java 中的排列来求解方程

[英]Using Permutations in Java for solving an equation

对于给定的问题,我被授予两个数字,它们将以这种方式求和为某个结果:

num1 + num2 = result

然而,这些数字将被“编码”,因此,例如,输入可能是:

ab + bc = acd

数字可以有任意长度,最多 9 位。

我的任务是创建一种有效的方法来查找每个输入有多少可能的解决方案,或者是否不可能。

我通过创建一个名为 Number(在 Java 中)的 class 解决了这个问题,它有一个字母(char 类型)和一个数值(int),然后我将每个数字转换为这个新的 class 数字的数组,所以我可以很容易地检查它们的当前值。

但是我不太确定如何处理这个回溯问题。

我知道我应该开始比较 number1 和 number2 的单位,然后是十位,依此类推,在每个“级别”中只选择总和合乎逻辑的情况,例如在上面的单位示例中b=2 和 c= 3 只有当 d=5 时才有意义,对于这两个预先存在的值,我可以丢弃 d.= 5 的所有其他情况。

有人告诉我可以只使用两个循环来覆盖所有这些排列:一个用于循环可能的数字 [0 到 9],一个用于覆盖所有字母/变量,但我不太明白如何完成!

如果我必须想象它,我想我可以把它想象成

for cycle ( through "columns" from the rightmost up to the leftmost column of the shortest number)
  for cycle( for numbers 0 to 9?) 

但是我仍然无法围绕这个主题的这种方法,或者我如何用递归来解决这个问题,非常感谢所有有助于提高我的理解的方法。

这是一种应该有效的算法。

让我们以您的示例等式为例:

ab + bc = acd
  1. 确定等式中唯一字符的数量。 在您的示例中,这将是四个(a、b、c、d)。

  2. 为了遍历所有的可能性,我们将建立一个循环。 此循环的最小值为 10 ^ 3 或 1,000。 此循环的最大值为 10 ^ 4 或 10,000。 等式中唯一字符的数量决定了您将使用的 10 的次方。 最大值为 10 ^ 10,大于int 一个long的工作。

  3. 在迭代中,将索引拆分为 N 位数字。 在您的示例中,这将是 4 位数字。 由于我们从 1,000 迭代到 9,999(包括 10,000)(不包括 10,000),因此所有索引值都将具有 4 位数字。

  4. 检查以确保 N 位数字是唯一的。 没有重复。 这将在开始时消除大部分索引值。

  5. 将数字代入方程式并检查方程式是否有效。 如果是这样,请将等式保存在List<String>中。

  6. Output List值或完成迭代后未找到解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM