如何创建一个数据类型以在C中保存200多位长数字?

时间:2011-03-25 17:30:02

标签: c types

好的,所以我正在努力解决这个问题: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的值!那么,我如何创建一个可以保存这个大值的数据类型呢?

2 个答案:

答案 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
}