1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
   |  
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
 
// cc -o fact -I/opt/local/include -L/opt/local/lib -lgmp fact.c
 
char *fact(unsigned long int inNumber, char *inBuffer, size_t inMaxBufSize)
{
    mpz_t r ;
 
    if (inBuffer == NULL) {
       inBuffer = calloc(inMaxBufSize, sizeof(char)) ;
       if (inBuffer == NULL) 
           return NULL ;
    }
 
    mpz_init(r) ;
    mpz_fac_ui (r, inNumber) ;
 
    gmp_snprintf (inBuffer, inMaxBufSize, "%Zd", r) ;
 
    return inBuffer ;
}
 
#define BSIZE (100000000)
 
int main(int argc,char **argv)
{
	char *buffer = calloc( BSIZE, sizeof(char)) ;
 
	char *s ;
 
	if (argc > 1)	{
		--argc ;
		while (*++argv) {
			unsigned int n = atoi(*argv) ;
			s = fact(n, buffer, BSIZE) ;
			printf("%d!= %s\n",n,s) ;
		}
	}
	else {
		char line[32] ;
 
		while (fgets(line, 32, stdin)) {
			if (0 == strcmp(line,".\n"))
				break ;
 
			unsigned int n = atoi(line) ;
			s = fact(n, buffer, BSIZE) ;
			printf("%d!= %s\n",n,s) ;
		}
	}
	return 0 ;
} |