在 Java 中使用 Permutations 求解方程

Posted

技术标签:

【中文标题】在 Java 中使用 Permutations 求解方程【英文标题】:Using Permutations in Java for solving an equation 【发布时间】:2020-09-20 05:53:48 【问题描述】:

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

num1 + num2 = result

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

ab + bc = acd

数字的长度不超过 9 位。

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

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

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

我知道我应该开始比较 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?) 

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

【问题讨论】:

您的意见是什么?你的输出是什么?你的问题不清楚。你说一个数字可以是9位,是不是意味着a可以是1236548??还是一个字母等于一个数字? @majid hajibaba:每个字母都是一个数字。一个方程的每个操作数或总和最多可以有九个字母。致 OP:我过去曾使用蛮力解决此类问题,因为该等式最多可以有 10 个不同的字母代表 0 - 9 和最多 27 个总字母(三个 10 ^ 9 整数)。小数字的嵌套循环很快。 【参考方案1】:

这是一种应该可行的算法。

让我们以你的例子为例:

ab + bc = acd

    确定方程式中唯一字符的数量。在您的示例中,这将是四个 (a, b, c, d)。

    为了遍历所有可能性,我们将设置一个循环。此循环的最小值为 10 ^ 3 或 1,000。此循环的最大值为 10 ^ 4 或 10,000。等式中唯一字符的数量决定了您将使用的 10 的幂。最大值为 10 ^ 10,大于 intlong 可以工作。

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

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

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

    完成迭代后输出List值或未找到解。

【讨论】:

以上是关于在 Java 中使用 Permutations 求解方程的主要内容,如果未能解决你的问题,请参考以下文章

47. Permutations II

Codeforces 285 E. Positions in Permutations

Permutations,全排列

46. Permutations

46. Permutations

CF 463D Gargari and Permutations [dp]