python - C++ 中的长数字

标签 python c++ math long-integer

我有这个 Python 程序:

# ...
print 2 ** (int(input())-1) % 1000000007

问题是这个程序在大数上工作了很长时间。我用 C++ 重写了我的代码,但有时我的答案是错误的。例如,在数字 12345678 的 Python 代码中,我得到了 749037894 并且它是正确的,但在 C++ 中,我得到了 -291172004

这是C++代码:

#include <iostream>
#include <cmath>
using namespace std;
const int MOD = 1e9 + 7;

int main() {
    // ...
    long long x;
    cin >> x;
    long long a =pow(2, (x-1));
    cout << a % MOD;
}

最佳答案

如前所述,您的问题是对于大指数,您有整数溢出。

要克服这个问题,请记住模乘法具有这样的特性:

(A * B) mod C = (A mod C * B mod C) mod C

然后您可以使用快速求幂方案实现“e 的幂 p 模 m”函数。 假设没有负权力:

long long powmod(long long e, long long p, long long m){
    if (p == 0){
        return 1;
    }
    long long a = 1;
    while (p > 1){
        if (p % 2 == 0){
            e = (e * e) % m;
            p /= 2;
        } else{
            a = (a * e) % m;
            e = (e * e) % m;
            p = (p - 1) / 2;
        }
    }
    return (a * e) % m;
}

请注意,每次乘法后都会取余数,因此不会发生溢出,如果单次乘法不溢出(1000000007mlong long).

关于python - C++ 中的长数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31227756/

相关文章:

python - 我们可以改变训练模型中的 input_length 吗?

c++函数将额外的 '\'添加到文件路径?

c++ - 当用户单击GTK + 3.0中的GtkFileChooser或GtkFileChooserButton时,如何触发事件?

math - 比较 l*a*b* 颜色

c - 小数点后N位C四舍五入

java - Java 测验(平均猜测)

python - 在 Python 中检索特定的集合元素

python - 根据列名称在两列之间删除 pandas 数据框中的多列

python - 如何在python中正确读取.mat openmodelica结果文件?

c++ - C++11放弃auto_ptr的原因是什么?