c ++中的大型int

时间:2015-03-07 19:33:51

标签: c++

假设我想在变量中存储2 ^ 100。没有整数类型允许这样做。但是这可以存储在一个双变量中,在小数点后面加零,即可以使用下面的代码。

double no = 1;
int i = 1;
for(i=1;i<=100;i++) no*=2;

我现在想要打印“不”&#39;没有小数点后的内容。可以做到这一点。我只对打印而不是存储感兴趣。

注意:我知道问题可以使用整数数组来完成,所以请不要建议这个方法。

4 个答案:

答案 0 :(得分:4)

您正在谈论任意精度整数,我建议使用GMP这样的库。请参阅https://gmplib.org

使用浮点数不能解决您的问题,因为它会将整数舍入到最接近的浮点数,您将失去精度。

“在典型的计算机系统中,'双精度'(64位)二进制浮点数的系数为53位(其中一个是隐含的),指数为11位,一个符号位。 “ (维基百科)

只要我们只处理2的幂,那么浮点表示就是精确的:一个有效数字(1)和一个等于100的指数。所以你可以使用double来逃避。一旦你添加了与存储的数字相比足够小的数字,你就会得到原始数字。经典的浮点问题。

答案 1 :(得分:1)

你说的是C ++,但这对C I / O来说要容易得多(你可以在C ++中使用它,但它不是真正的C ++)。您只想以f格式打印,小数点后没有数字:

printf("%.0f\n", no);

在C ++中,你也可以这样做:

std::cout << std::fixed << std::setprecision(0) << no << std::endl;

更加冗长,并且对以后打印的内容产生持久影响...

答案 2 :(得分:1)

类似的东西:

std::cout << std::fixed << std::setprecision(0) << no << std::endl;

完成计划:

#include <iostream>
#include <iomanip>

int main()
{
    double no = 1;
    int i = 1;
    for(i=1;i<=100;i++) no*=2;
    std::cout << std::fixed << std::setprecision(0) << no << std::endl;
}

打印:

1267650600228229401496703205376

(正好是2 ^ 100,但如果你在上面的代码中执行no + 1.0,它会打印完全相同的值,因为添加一个值超出了值的覆盖精度。

答案 3 :(得分:0)

您需要使用数组来模拟它。这是一个很好的问题,因为它对其他欧拉问题很有用。