c++ - 如何计算2的10000000次方

标签 c++ c data-structures

<分区>

如何在不使编译器崩溃的情况下计算 2 的 10000000 次方。 c/c++ 中超大整数的数据类型应该是什么。

最佳答案

对于非常具体的值 2 的 1000 次方,double 就足够了。

#include <stdio.h>
#include <math.h>

int main(int argc, const char *argv[]) {
    printf("%f\n", pow(2., 1000));
    return 0;
}

但一般而言,您需要实现任意精度乘法算法来计算如此大的数字(或使用提供该功能的库)。

C++ 没有用于此类计算的预定义标准函数。

如果您想将自己的版本作为练习来实现,那么我的建议是使用以 10000 为基数的数字。它们足够小,一位数乘法不会溢出,而且可以非常简单快速地将结果转换为decimal 在末尾,因为您只需将以 10000 为基数的数字映射到 decimal,而无需实现除法模数。

还要计算如此大的幂 (10,000,000),您需要通过平方来实现幂,即

BigNum pow(BigNum a, int b) {
    if (b == 0) {
        return 1;
    } else if (b & 1) {
        return a*pow(a, b-1);
    } else {
        BigNum x = pow(a, b/2);
        return x*x;
    }
}

这将允许使用 O(log(b)) 而不是 O(b) 乘法来计算 pow(a, b) .

关于c++ - 如何计算2的10000000次方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39433452/

相关文章:

c - 将函数作为参数传递,带或不带 & 符号 c

c# - 我应该为包含 10 个或更少项目的集合使用字典,还是有更好的选择?

c# - 具有独特元素和快速添加和删除的数据结构

algorithm - 我怎样才能使这个算法更有效率?

c++ - 如何有效地提取 cv::Mat 的子集

c++ - 在库中处理 Posix 信号

c++ - 动态创建指针数组

c - SDL2 - 读取像素以进行碰撞检测

c++ - 很长的编译时间

通过 void * 转换枚举