如何在不崩溃编译器的情况下将2计算为功率10000000。在c / c ++中,外部大整数的数据类型应该是什么。
答案 0 :(得分:5)
对于提升到1000的幂的非常具体的值2
,double
就足够了。
#include <stdio.h>
#include <math.h>
int main(int argc, const char *argv[]) {
printf("%f\n", pow(2., 1000));
return 0;
}
一般情况下,您需要实现一个任意精度乘法算法来计算大数字(或使用提供该数字的库)。
C ++没有用于此类计算的预定义标准函数。
如果您想将自己的版本作为练习实施,那么我的建议是使用基数为10000的数字。它们足够小,以至于单位数乘法不会溢出而且它非常在结尾处将结果简单快速地转换为十进制,因为您可以将base-10000数字映射到十进制,而不必实现除模数。
同样要计算如此大的功率(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;
}
}
这将允许使用pow(a, b)
计算O(log(b))
而不是O(b)
次乘法。
答案 1 :(得分:3)
将数字存储在int数组中,其中数组的每个位置表示一位数。然后重复相乘。这样你就可以在没有崩溃编译器的情况下得到答案。
那么你需要302个位置。乘法只是我们在年级上所做的。你已经在编码中实现它。
int d[400];
for(int i=0;i<399;i++)
d[i]=0;
d[0]=1;
int carry=0;
int temp=0;
for(int j=0;j<=999;j++)
{
carry=0;
temp=0;
for(int i=0;i<=399;i++)
{
temp=d[i]*2+carry;
d[i]= temp%10;
carry = temp/10;
}
}
print d[0..399] in reverse order trimming zeroes.
答案 2 :(得分:1)
与Python / Java不同,C ++本身并不处理这么大的数字,也没有专门的数据类型。 您需要使用数组来存储数字。您没有问题的数据类型。这些问题在竞争性节目网站中很常见。这是一个详细的教程。
您还可以了解位操作。当你乘以2时它们很方便。
请在使用另一个答案中提到的pow(2。,1000)之前阅读此内容。 c++ pow(2,1000) is normaly to big for double, but it's working. why?
正如@ 6502在他的回答中巧妙地说的那样,它可以用于2 ^ 1000的特定情况。我错过了,如果你打算在竞争激烈的编程网站上使用它,请小心。