假设我想在变量中存储2 ^ 100。没有整数类型允许这样做。但是这可以存储在一个双变量中,在小数点后面加零,即可以使用下面的代码。
double no = 1;
int i = 1;
for(i=1;i<=100;i++) no*=2;
我现在想要打印“不”&#39;没有小数点后的内容。可以做到这一点。我只对打印而不是存储感兴趣。
注意:我知道问题可以使用整数数组来完成,所以请不要建议这个方法。
答案 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)
您需要使用数组来模拟它。这是一个很好的问题,因为它对其他欧拉问题很有用。