给出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()。
我的直觉告诉我,需要一种更简单的方法来执行此操作,但我尚未发现它。我花了太多的力气想出一个优雅的解决方案,但是我很固执。这可能是数学问题,而不是编程问题,但我认为这里的某个人可能会指出正确的方向。 谢谢:)
答案 0 :(得分:1)
您实际上有一个3x3矩阵,其中每一列都必须相加为isChecked()
(该列中的所有元素均为0
),0
(该列中的所有元素均为{{1 }} 或列中的元素是3
,1
和0
和1
(列为2
。
由于列的总和必须为6
,2
或0
,因此我们可以简单地检查总和是否可以被3
整除。
检查此代码如下:
6
由于3
,private 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
,以有效地丢弃最低有效的三进制数字。
这也是个人喜好,但是对3
,3
和a /= 3
的调用可以移到for循环的 increment 部分:
b /= 3