【问题标题】:division of two very large numbers两个非常大的数的除法
【发布时间】:2015-09-11 19:27:37
【问题描述】:

我要计算(a+b)/pow(2,s)

-10^10 ≤ s ≤ 10^10
1 ≤ a, b ≤ 10^9

但即使我将结果存储在 long long 中,它也会给出 0。鉴于答案在 long 的范围内,我该如何计算结果?

【问题讨论】:

  • 改用浮点数或 bignum 库。
  • 你用这么大的数字到底是为了什么?你想完成什么?
  • 旁白:pow 用于 浮点 求幂;进行整数计算时不应该使用它。
  • 2 的 10 ^10:th power 太大了,Wolfram Alpha 被它呛住了。 10^9:th power is ~4.65 * 10 ^ 301029995, so for all the actual purpose, the result is 0. (宇宙中的原子数估计为 10 ^ 80。)
  • 您确定是-10^10 ≤ s ≤ 10^10 而不是-10^10 ≤ pow(2,s) ≤ 10^10

标签: c++ c algorithm


【解决方案1】:

您不需要为此除法...除以 2 的幂只是右移。

【讨论】:

  • @Ishan:你的问题使用long long,所以不用担心。
  • 使用浮点数(或双精度),您可以通过调整指数来“移位”。请参阅 ldexp 函数。
  • 我想明白请详细说明
  • 我删除了我的答案,因为它毫无意义。我认为这是最好的方法。
【解决方案2】:

您可能需要一个好的 bignum 库,例如GMPlib

Bignum 运算是一个困难的算法问题(有几本关于该主题的书籍,您仍然可以获得博士学位来改进它们)。所以不要试图自己重新发明它们(如果你想让它们比每个人在小学学到的缓慢的幼稚算法更有效,你需要多年的努力),而是使用现有的 bignum 库。

也许你有一些XY problem,实际上你不需要计算它。 (你的问题没有足够的动机)。

【讨论】:

    【解决方案3】:

    您可以使用std::bitset<log2(10^9)>手动计算总和,然后在结果上调用operator>>=( s )并通过std:bitset::to_ulong()获得long

    【讨论】:

    • 而答案在很多情况下会为零,ulong不能代表x/(2^10^10)
    • @pm "鉴于答案在 long 的范围内"
    • 对于给定的输入约束,答案不在 long 的范围内。 2 * 10^9 / pow(2,10^10) 不长
    • @pm100 它在给定要求的范围内。我不会质疑他们。
    • 不,不是 - 该范围内的许多答案都超出了图表范围
    【解决方案4】:

    您可以使用boost cpp_int,这是最简单的方法。

    【讨论】:

      猜你喜欢
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多