好的,所以我正在努力解决这个问题:http://www.spoj.pl/problems/FCTRL2/
根据我对c的了解,我提出了这个代码:
#include <stdio.h>
#include <conio.h>
long double factorial(int);
int main()
{
long double num[100], fact[100];
int i = 0, ex;
scanf("%d", &ex);
for ( i = 0; i < ex; i++ )
{
scanf("%lf", &num[i]);
}
i = 0;
printf("\n");
for (i = 0; i < ex; i++ )
{
fact[i] = factorial(num[i]);
printf("%.0lf\n", fact[i]);
}
getch();
return 0;
}
long double factorial(int num)
{
long double onum, fact;
int i;
fact = 1;
onum = num;
for ( i = 1; i < onum; i++ )
{
fact = fact * num;
num--;
}
return fact;
}
问题是长双倍不足以保持长达100的值!那么,我如何创建一个可以保存这个大值的数据类型呢?
答案 0 :(得分:1)
没有可以容纳大数字的本机数据类型。查看GNU Multiple Precision Arithmetic Library。
GMP可能对您的特定问题有点过分,但它会完成工作。您也可以编写自己的小任意精度库来完成它。
编辑 - 示例bignum类型:
struct mybignum
{
int length;
int sign;
int digit[200];
};
您可以使用该结构实现加法,减法,乘法等的小学校准算法,以及200位数字支持。
答案 1 :(得分:1)
对于这个特殊问题,GMP确实是一种矫枉过正。
事实上,即使是Carl Norum提出的结构,虽然有用且更通用,但它包含的不仅仅是你需要的结构。特别是,由于所有阶乘都是正整数,因此您无需担心该符号。
此外,没有必要实现加法,减法甚至一般乘法。你只需要担心将这些“bignums”中的一个乘以一个整数,这不是太难。
这是乘法运算的存根
void multiply( mybignum bn, int factor ) {
// for each of the digits in 'bn'
// multiplies 'factor' by the particular digit
// adds the previous remainder and stores
// the new carry value
}