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 ;
} |
Partager