什么数据类型可以存储100的阶乘

时间:2014-05-26 09:32:51

标签: c++ type-conversion factorial

为什么以下程序将factorial打印为0表示100作为输入。如果getFact函数的返回类型为long double,则可以计算相同的阶乘,但为了得到数字的总和,我不能在长双精度上使用 mod(%)运算符。

注意:我的计算机上unsigned long longlong double的大小相同。 请建议输入为100什么类型的数据可以提供正确的输出。

#include <iostream>
#include <stdlib.h>

unsigned long long int getFactorial(int);
unsigned long long int getSum(unsigned long long int);

int main()
{
    unsigned long long int fact = 1;
    unsigned long long int digsum  = 0;
    std::cout << "Enter a number to find fact := ";
    int num;
    std::cin >> num;
    fact = getFactorial(num);
    std::cout << num <<"'s factorial is = " << fact << std::endl;
    digsum = getSum(fact);
    std::cout << sizeof(unsigned long long int) << std::endl;
    std::cout << sizeof(long double) << std:: endl;
    std::cout << "Sum of the digits in the number" << num << "! is :=" <<  digsum << std::endl;
    return 0;
}

unsigned long long int getFactorial(int num)
{

    if(num == 1)
        return 1;
    else
        return (num * getFactorial(num - 1));
}


unsigned long long int getSum(unsigned long long int fact)
{
    if(fact == 0)
        return 0;
    else
    {
        int temp = 0;
        temp = fact % 10;
        return (temp + getSum(fact/10));
    }
}

3 个答案:

答案 0 :(得分:4)

如果你想要一个近似值,你可以使用double。 (注意整数运算与double不同)。您可以使用log计算或乘法来估算100!

但是因为你想要数字之和,你需要精确的结果,你需要一些big integer library。你可以谷歌大整数。

或者您可以存储大number as string并按照我们在学校使用笔和纸学习的方式执行您的计算(产品)。

答案 1 :(得分:2)

使用double而不是long long int,对于100 !, long long int太短而无法保存结果。

double getFactorial(double num)
{
    if (num <= 1)
        return 1;
    else
        return (num * getFactorial(num - 1));
}

答案 2 :(得分:0)

使用long double我比较了结果并且效果很好,直到25,因为有错误。

#include <iostream>
#include <iomanip>

using namespace std;

long double factorial(long double n)
{
    if (n<=1)
        return 1;
    else
    {
        return n*factorial(n-1);
    }
}

int main()
{
    long double fact;
    for(long double i=0;i<50;i++)
    {
        fact=factorial(i);
        cout<<i<<"!= "<<setprecision(0)<<fixed<<fact<<endl;;
    }
    return 0;
}