-2

我尝试使用 double 但它会给我像 3.2e+12 这样的科学答案。我需要正确的答案。我该怎么做?

到目前为止我的代码:

    int n, x;
    double fact;
    cin>>n;

    while(n--)
    {
        fact=1;
        cin>>x;
        for(;x>1;x--)
            fact*=x;
        cout<<fact<<endl;
    }
4

3 回答 3

1

首先,使用浮点格式如 double 和 float 总是会引入舍入误差,如果你想减少大数字的误差,请使用 long 或 long long,但是这些将无法表示像 double 或long double(请注意,long long 和 long double 的行为和支持因编译器而异)。您可能想研究像 bigint 或 bigdouble 这样的 BigNum,尽管您会牺牲性能。

也就是说,这个问题也可能是设置格式之一:数字足够大,可以以科学计数法输出,要更改它,您可以使用

cout<<std::fixed;

如何使 C++ cout 不使用科学记数法的可能重复项

于 2013-10-09T12:34:44.150 回答
0

double是固定大小的类型,通常为 64 位,精度为 53 位;所以它不能准确地表示任何超过 16 位的整数。最大的标准整数类型通常有 64 位,可以表示最多约 19 位的整数。100!比这大得多,因此无法用任何内置类型准确表示。

您将需要一个大整数类型,将数字表示为较小数字的数组。没有标准类型;您可以使用Boost.MultiprecisionGMP之类的库,或者,由于这是一个编程挑战,您可以自己实现它。要计算阶乘,您需要实现乘法;最简单的方法是使用您在学校学习的“长乘法”算法。

于 2013-10-09T12:29:20.773 回答
0

到目前为止,没有任何数据类型可以存储像 (100!) 这样大的数字。你应该完成一个 BigIntenger 类来计算 100!;通常,如此大的数字可以通过字符串存储。

于 2013-10-09T13:02:56.947 回答