Как создать тип данных для хранения более 200 цифр длинных чисел в C? - PullRequest
1 голос
/ 25 марта 2011

ОК, поэтому я пытаюсь решить эту проблему: 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;
}

Проблемаявляется то, что long double недостаточно для хранения значений до 100!Итак, как я могу создать тип данных, который может содержать это большое значение?

Ответы [ 2 ]

1 голос
/ 25 марта 2011

Для этой конкретной проблемы GMP действительно является излишним.

На самом деле, даже структура, представленная Карлом Норумом, хотя и полезна и носит более общий характер, содержит больше, чем вам потребуется.В частности, поскольку все факториалы являются натуральными числами, вам не нужно беспокоиться о знаке.

Кроме того, нет необходимости реализовывать сложение, вычитание или даже общее умножение.Вам нужно только побеспокоиться о умножении одного из этих "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
}
1 голос
/ 25 марта 2011

Нет собственного типа данных, который может содержать такие большие числа.Ознакомьтесь с GNU Multi-Precision Арифметической библиотекой .

GMP может быть немного излишним для вашей конкретной проблемы, но он справится с работой.Вы также можете написать свою собственную маленькую библиотеку произвольной точности, чтобы сделать это.

Edit - пример типа bignum:

struct mybignum 
{
    int length;
    int sign;
    int digit[200];
};

Вы можете просто реализовать алгоритмы начальной школы для сложения, вычитания,умножение и т. д. с использованием этой структуры и preto - поддержка 200-значного числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...