<分区>
如何在不使编译器崩溃的情况下计算 2 的 10000000 次方。 c/c++ 中超大整数的数据类型应该是什么。
标签 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/