【问题标题】:Counting the number of solutions for 2 related equations计算 2 个相关方程的解数
【发布时间】:2015-06-17 23:07:51
【问题描述】:

我如何找到解决方案的数量

s = a+b
x = a^b

sx 给出时,^ 表示xor

那么喜欢(0,0)(31,31)(15,10)

我尝试将x 转换为二进制字符串,但之后我不确定该去哪里。

【问题讨论】:

  • 这是幂运算还是逻辑位“与”?
  • @LutzL 我认为这是一个异或。
  • 它的 XOR 对不起,我应该更具体。
  • 您需要找到单个作业(a, b),还是需要全部?
  • 我需要找到所有,a 和 b 的可能解决方案的数量

标签: java algorithm math xor


【解决方案1】:

如果没有解决方案,solution 方法将返回 null。如果有解决方案,它会返回a(仅针对一种解决方案)。您可以通过s - ax ^ a 获得b

如果存在解决方案,则解决方案的总数(在long 中)是Long.bitCount(x) 的2 次方。

例如,为s = 24x = 6 找到的解决方案是a = 9b = 15。 二进制:

 9 = 1001
15 = 1111

这些数字在 2 个位置上不同,因此总共有 Math.pow(2, 2) = 4 个解决方案。您可以通过将a 的位与b 的相应位交换部分或全部这些位置来获得所有可能的解决方案。

这给出了 3 个进一步的解决方案。

11 = 1011     13 = 1101     15 = 1111
13 = 1101     11 = 1011      9 = 1001

代码如下:

public static Long solution(long s, long x) {
    return recursive(s, x, false);
}

private static Long recursive(long s, long x, boolean carry) {
    boolean s1 = (s & 1) == 1;
    boolean x1 = (x & 1) == 1;
    if ((s1 == x1) == carry)
        return null;
    if ((s == 0 || s == -1) && (x == 0 || x == -1))
        return s;
    Long a;
    if (x1)
        return (a = recursive(s >> 1, x >> 1, carry)) == null ? null : a << 1;
    if ((a = recursive(s >> 1, x >> 1, false)) != null)
        return a << 1;
    if ((a = recursive(s >> 1, x >> 1, true)) != null)
        return 1 + (a << 1);
    return null;
}

我决定不编写一个方法来返回所有解决方案的HashSet,因为这些集合在某些情况下会很大。但是,您可以编写一种方法来生成所有可能的解决方案,而无需一次将它们全部存储在内存中。例如,请参阅Generating all binary numbers based on the pattern

【讨论】:

    【解决方案2】:

    让我们用 v_j 表示值 v 的第 j 位,其中 j=0 是最低有效位。

    关键的观察是算术和 a+b 可以用 xor 操作 a ^ b 和加法的进位来表示。 我们有

    s_j = a_j ^ b_j ^ c_j = x ^ c_j
    

    其中 c_j 是添加到第 j 个位置的进位位。 要弄清楚进位会发生什么,请注意

    c_0 = 0
    c_1 = a_0 & b_0   (so c_1 is one when both a_0 and b_0 are one)
    c_j = 1 if and only if at least two of a_j, b_j, c_(j-1) are one.
    

    最后一个条件本质上是说

    c_j = Majority(a_j, b_j, c_(j-1)) = a_j & b_j ^ a_j & c_(j-1) ^ b_j & c_(j-1)
    

    同时拥有 a + b 和 a ^ b 你可以确定进位的位 c_j 并且你应该能够根据 c_j 和 c_ 的值推导出每个 a_j、b_j 的解决方案数量的公式(j-1)。

    【讨论】:

      猜你喜欢
      • 2012-09-18
      • 2011-04-07
      • 2017-09-23
      • 2023-03-25
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      相关资源
      最近更新 更多