问题描述
对于给定的问题,我被授予两个数字,这些数字将以这种方式求和成一定的结果:
num1 + num2 = result
但是这些数字将被“编码”,例如,输入可能是:
ab + bc = acd
数字最多可以是9位数字。
我的任务是创建一种有效的方法,以查找每个输入有多少可能的解决方案,或者是否不可能。
我通过创建一个名为Number(在Java中)的类解决了此问题,该类具有字母(字符类型)和数值(int),然后将每个数字转换为该新类Number的数组,因此我可以轻松检查它们的当前值。
但是我不确定如何解决此回溯问题。
我知道我应该开始比较数字1和数字2的单位,然后比较十位数,等等,在每个“级别”中,仅选择总和为逻辑的情况,例如,在上面的示例中对于单位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
-
确定方程式中的唯一字符数。在您的示例中,该值为四个(a,b,c,d)。
-
为了迭代所有可能性,我们将建立一个循环。此循环的最小值为10 ^ 3或1,000。此循环的最大值为10 ^ 4或10,000。方程式中唯一字符的数量决定了您将使用的10的幂。最大最大值为10 ^ 10,大于
int
。long
可以工作。 -
在迭代中,将索引分成N个数字。在您的示例中,这将是4位数字。由于我们要从1,000迭代到9,999(包括10,000)(不包括10,000),因此所有索引值都将有4位数字。
-
检查以确保N位数字是唯一的。无重复。这将消除开头的大多数索引值。
-
将数字代入方程式中,然后检查方程式是否有效。如果是这样,请将方程式保存到
List<String>
中。 -
在完成迭代后输出
List
值或找不到解决方案。