Creo que ya la tengo!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef char ent30[31];
void aleat30(ent30 z);
void sumarn30(ent30 a,ent30 b,ent30 suma,int *acarreo);
int main(void)
{
ent30 a,b,suma;
int acarreo;
srand(time(0));
aleat30(a);
aleat30(b);
sumarn30(a,b,suma,&acarreo);
printf(" a = %31s\n b = %31s\nsuma = %d%30s\n",a,b,acarreo,suma);
return 0;
}
void aleat30(ent30 z)
{
int i;
for(i=0;i<30;i++)
{
z[i]='0'+rand()%10;
}
z[30]='\0';
}
#define CharADig(c) ((int)((c)-'0'))
#define DigAChar(d) ((char)(d)+'0')
void sumarn30(ent30 a,ent30 b,ent30 suma,int *ua)
{
int i,ap=0;
suma[30]='\0';
for(i=29;i>=0;i--)
{
const int sumadig=CharADig(a[i])+CharADig(b[i])+ap;
suma[i]=DigAChar(sumadig%10);
ap=sumadig/10;
}
*ua=ap;
}
Reto #18 (Otro que tiene que ver con números grandes):
Calcular el factorial de un número
n, 0<=n<=100. Sin usar tipos de datos de punto flotante (float, double, etc).
Y para los que puedan pensar que es una tarea, pues no, no lo es.
