【问题标题】:What data type can store a factorial of 100什么数据类型可以存储100的阶乘
【发布时间】:2014-05-26 09:32:51
【问题描述】:

为什么下面的程序将 100 的阶乘打印为 0 作为输入。如果 getFact 函数的返回类型为 long double,则可以计算相同的阶乘,但要获得数字总和,我无法在 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));
    }
}

【问题讨论】:

  • 任何标准类型都太小了。你可以使用 boost 或其他东西。
  • 尝试在整数数组中可视化乘法的结果,每个数字占用数组中的索引。设计一个使用数组作为存储类型的解决方案。
  • @Surfing_SO 不,100!有 157 个十进制数字,525 个二进制数字。 Google 的结果是一个近似值。
  • @Surfing_SO A long doublelong long 是持有号码的完全不同的概念!尽管它们可能占用相同数量的物理空间。

标签: c++ type-conversion factorial


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • == 用于双精度是危险的。
    • 为什么不直接和 1 比较呢? IE。 if (num &lt;= 1) return 1?
    【解决方案3】:

    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;
    }
    

    【讨论】:

    • 你只试过double吗?当 double 单独工作时,你的答案有什么意义,据你说,它只在 25 岁之前有效?
    猜你喜欢
    • 2015-04-16
    • 1970-01-01
    • 2015-03-05
    • 2018-11-04
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多