【问题标题】:How to calculate pow(2,n) when n exceeds 64 in c++?c++中n超过64时如何计算pow(2,n)?
【发布时间】:2023-03-15 04:42:01
【问题描述】:

所以,我是 C++ 编程的新手,我遇到了这个问题,我需要计算 pow(2,n)/2 where n>64 ?

我尝试使用 unsigned long long int 但由于 c++ 的限制仅为 2^64。那么有什么方法可以计算出来吗?

编辑:

 1 < n < 10^5

表达式的结果用于进一步计算

这个问题是在线平台上问的。所以,我不能使用像gmp这样的库来处理大量的数字。

问题

给你一个大小为 N 的数组 A。如果元素 Ai 的值 (Ai) 大于或等于 Ki 是数组 A 中由元素 Ai 组成的子集的总数.
数组的总电荷值定义为数组中存在的所有带电元素的总和 mod (10^9)+7
你的任务是输出给定数组的总电荷值。

【问题讨论】:

  • 你想对结果做什么,打印出来?我很确定一个简单的std::cout &lt;&lt; std::setprecision(1000) &lt;&lt; std::pow(2.l,n) &lt;&lt; '\n'; 应该可以工作。
  • 如果你想要精确的算术,你应该使用像 gmp 这样的 bignum 库。
  • 这个问题肯定还有更多?例如,也许问题要求pow(2, n) mod p 或类似的东西?
  • 这听起来像是XY problem。如果问题只要求您打印结果,您可能需要实现自己的大整数库或类似的东西。由于您提到您需要在进一步的计算中使用结果,因此可能会操纵您的公式以避免像这样的大量计算。所以请发布完整的问题。
  • 这并没有解决问题,但pow(2,n)/2pow(2,n-1)

标签: c++ c++11 unsigned-integer


【解决方案1】:

这里的一个重要细节是,您不会被要求为巨大的 n 计算 2n。相反,您被要求为大 n 计算 2n mod 109 + 7,这是一个不同的问题。

例如,假设您要计算 270 mod 109 + 1。请注意,270 不适合一个 64 位机器字。但是,270 = 230 · 235,而 235 确实适合 64 位机器单词。因此,我们可以这样计算得到 270 mod 109 + 7:

270 (mod 109 + 7)

= 235 · 235 (mod 109 + 7)

= (235 mod 109 + 7) · (235 mod 109 + 7 ) 模组 109 + 7

= (34359738368 mod 109 + 7) · (34359738368 mod 109 + 7) mod 109 + 7

= (359738130 · 359738130) mod 109 + 7

= 129411522175896900 mod 109 + 7

= 270016253

更一般地说,通过使用repeated squaring,您可以计算 2n mod 109 + 7 以非常适合 64 的任何 n 值-位整数。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    在严肃的数值工作中,常用的方法是重写公式。您存储log(x) 而不是x,稍后当您确实需要x 时,它通常会在您不需要所有这些数字的上下文中。

    【讨论】:

    • 虽然我完全同意你的观点,在严肃的数值工作中通过对数表达事物是一个好主意,但这似乎是在需要精确值的编程竞赛问题的背景下。我的怀疑是他们正在通过与重复的 mod 平方来寻找幂。
    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 2019-08-29
    • 2012-01-19
    • 1970-01-01
    • 2015-06-29
    • 2014-07-13
    • 1970-01-01
    • 2012-07-30
    相关资源
    最近更新 更多