有没有一种快速方法可以根据一个简单的规则集比较3个三进制数?

时间:2019-05-19 21:40:22

标签: java math

给出3个相等长度的三进制(基数3)数字(它们可以在左边用零填充),有没有一种快速简单的方法来比较每个位置值(或列),使得每列由3组成不同的数字或3个相同的数字。

例如:

diff.tool

到目前为止我尝试过的一切

我目前最好的解决方案是将3个数字相加,但要像小数一样将它们相加而不是(所以第一个好的对将变成333而不是1110)。然后,我检查每个数字并检查是否可以被3整除。

起初,我正在检查整个数字是否可以被3整除,但是在很多数字上都失败了。

merge.tool

如您所见,仅将3除是一项不够好的检查,因为您可以快速看出这些列实际上违反了我设置的规则。 这是我编写的检查它是否正确解释的方法:

Good pairs:     || Bad pairs:
________________||________________ 
101 | 000 | 012 || 111 | 012 | 002 
212 | 111 | 112 || 122 | 120 | 022
020 | 222 | 212 || 120 | 202 | 102

我还把数字加为十进制,然后将结果转换为三进制,然后尝试检查属性无济于事。 我有第二种方法,其行为与上述类似,但未使用字符串。相反,它将数字除以10000、1000等,因为您不能对数字执行.charAt()。

真实Q

我的直觉告诉我,需要一种更简单的方法来执行此操作,但我尚未发现它。我花了太多的力气想出一个优雅的解决方案,但是我很固执。这可能是数学问题,而不是编程问题,但我认为这里的某个人可能会指出正确的方向。 谢谢:)

1 个答案:

答案 0 :(得分:1)

您实际上有一个3x3矩阵,其中每一列都必须相加为isChecked()(该列中的所有元素均为0),0(该列中的所有元素均为{{1 }} 列中的元素是3101(列为2

由于列的总和必须为620,因此我们可以简单地检查总和是否可以被3整除。

检查此代码如下:

6

由于3private static boolean ternary(int a, int b, int c) { for (int i = 0; i < 3; i++) { if ((a % 3 + b % 3 + c % 3) % 3 != 0) { return false; } a /= 3; b /= 3; c /= 3; } return true; } a被输入为十进制(以10为底),我们可以使用b(在每个值上)获得最低有效位三进制数字,如果它们的和不能被c整除,则返回n % 3

但是,我们随后需要将每个值除以false,以有效地丢弃最低有效的三进制数字。


这也是个人喜好,但是对33a /= 3的调用可以移到for循环的 increment 部分:

b /= 3