c++ - 我怎样才能知道是否可以使用它使数组中的数字相等?

标签 c++ algorithm

这个问题是在面试中问到我的,我真的想不出一个解决方案:

如果给我一个包含一些数字的数组,我可以将每个数字无限次地翻倍或翻三倍,我只需要找出这些数字是否可以彼此相等,如何我可以做吗?这可能是什么算法?

最佳答案

让我们从该数组中取出两个元素,并将它们命名为ab。现在让我们将它们加倍和加倍,直到它们相等:

a * 2^i * 3^j == b * 2^m * 3^n

由此我们可以得出结论,如果(通过上述等式的简单变换),这是可行的

a / (2^m * 3^n) == b / (2^i * 3^j)

起初,这似乎没什么用。但请记住,每个数字都可以表示为其质因数的乘积:

c = 2^u * 3^v * 5^w * 7^x * 11^y * ...
(u, v, w, ... may be 0)

现在将其应用于前面的等式,如果我们使 mn 等于 2 和 3 的数量(uv) a 的所有剩余部分将是除 2 和 3 之外的所有质因数的乘积。对 b 做同样的事情,然后比较结果。

现在将其放入算法(并将其应用于更多数字)并不是那么困难(尽管我们需要小心,因为我们肯定不想计算所有元素的所有质因数)。

  1. 取第一个元素
  2. 除以 2 直到不能再被 2 整除
  3. 相同,但用于 3
  4. 将其保存为要比较的值
  5. 取下一个元素
  6. 除以2,只要它能被2整除
  7. 同样适用于 3
  8. 将结果与保存的值进行比较,如果不同则返回false
  9. 否则,如果还有剩余元素,则转到 5。
  10. 如果没有剩余元素,返回true

关于c++ - 我怎样才能知道是否可以使用它使数组中的数字相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32288600/

相关文章:

c++ - 我如何获得另一个柜台?

c++ - POST HTTP 请求以使用 Java 脚本和 C++ 使用用户名和密码登录

algorithm - 如何检测一条线是否与另一个图形重合?

c# - 这个模式/算法叫什么?让订阅者随机排序一次只有一个人可以使用react的事件

algorithm - 计算可能序列的数量

c++ - 如何使用递归缩进行?

c++ - 在循环/if 括号后检测分号

algorithm - 对于提取最大元素,平衡二叉搜索树和最大堆哪个更好?

c - 我怎样才能在 C 中具体取出整数中的数字?

c++ - 为什么正则表达式在 C++ 的日语字符串中找不到 "("?