2014-12-28 3 views
-4

Как вычислить факториал чисел, таких как 300, поскольку выходной сигнал даже не связан с длиной без знака long long? Пожалуйста, помогите.Факториалы больших чисел

#include<stdio.h> 
#include<stdlib.h> 


unsigned long long int factorial(int number) { 
    unsigned long long int temp; 

    if(number <= 1) return 1; 

    temp = (number * factorial(number - 1)); 
    return temp; 
} 

int main(){ 
    int t,k,i,a[100001]; 
    unsigned long long int sum[100001]; 
    scanf("%d",&t); 
    for(i=0;i<t;i++){ 
     scanf("%d",&a[i]); 

    } 
    for(k=0;k<t;k++){ 
      sum[k]=0; 
    for(i=0;i<=a[k];i++){ 
     sum[k] += ((factorial(a[k])/(factorial(i)*factorial(a[k]-i)))%3); 
     //printf("%d\n",sum[k]); 
    }} 
    for(i=0;i<t;i++){ 
     printf("%llu\n",sum[i]); 
    } 
    return 0; 

} 

Я пробовал это, но он останавливался всего на 60 !.

+0

Вы должны использовать большие массивы, [как этот парень сделал] (http://stackoverflow.com/questions/27650119/small-factorial-spoj-code -fctrl2) – user3386109

+0

Вы уверены, что '300!' не переполняет 'unsigned long long int'? –

+1

http://stackoverflow.com/a/17039284/971127 – BLUEPIXY

ответ

1

Вы можете попробовать это для Factorials of large numbers:

#include<iostream> 
#include<cstring> 

int max = 5000; 

void display(int arr[]){ 
    int ctr = 0; 
    for (int i=0; i<max; i++){ 
     if (!ctr && arr[i])   ctr = 1; 
     if(ctr) 
      std::cout<<arr[i]; 
    } 
} 


void factorial(int arr[], int n){ 
    if (!n) return; 
    int carry = 0; 
    for (int i=max-1; i>=0; --i){ 
     arr[i] = (arr[i] * n) + carry; 
     carry = arr[i]/10; 
     arr[i] %= 10; 
    } 
    factorial(arr,n-1); 
} 

int main(){ 
    int *arr = new int[max]; 
    std::memset(arr,0,max*sizeof(int)); 
    arr[max-1] = 1; 
    int num; 
    std::cout<<"Enter the number: "; 
    std::cin>>num; 
    std::cout<<"factorial of "<<num<<"is :\n"; 
    factorial(arr,num); 
    display(arr); 
    delete[] arr; 
    return 0; 
} 
Смежные вопросы