为什么以下程序将factorial打印为0表示100作为输入。如果getFact函数的返回类型为long double
,则可以计算相同的阶乘,但为了得到数字的总和,我不能在长双精度上使用 mod(%)运算符。
注意:我的计算机上unsigned long long
和long 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));
}
}
答案 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;
}