#include <stdio.h>
#include <math.h>
#include <assert.h>
#define LIMIT 50000
int primosmenores(unsigned int numero, unsigned int primos[]);
int esprimo(unsigned int numero);
int factorizar(unsigned int numero, unsigned int factores[]);
void main()
{
int i, ii, cantdivisores, cantprimos;
unsigned int numero, factores[LIMIT];
// cantprimos = factorizar(7320,factores);
numero = 0;
for (i = 1; cantdivisores != 500; i++)
{
for (ii = 0; ii < LIMIT; ii++)
{
factores[ii] = 0;
}
cantdivisores = 1;
numero += i;
printf("El numero %d es el %d numero triangulo\n", numero,i);
cantprimos = factorizar(numero,factores);
for (ii = 0; ii < cantprimos; ii++)
{
while ((factores[ii] == 0) && (ii < cantprimos))
{
ii++;
}
// printf("El factor numero %d es %d\n",i,factores[i]);
cantdivisores = cantdivisores*(factores[ii]+1);
}
printf("El numero %d tiene %d divisores\n", numero, cantdivisores);
}
printf("El numero es %d\n", numero);
}
int primosmenores(unsigned int numero, unsigned int primos[])
{
int i, ii;
for (i = 0; i < LIMIT; i++)
{
primos[i] = 0;
}
for ((i = 1) && (ii = 0); i <= (numero/2); i++)
{
if (esprimo(i) == 1)
{
primos[ii] = i;
ii++;
}
}
return ii;
}
int esprimo(unsigned int numero)
{
int r,f;
if (numero == 1)
{
return 0;
}
else if (numero < 4)
{
return 1;
}
else if ((numero % 2) == 0)
{
return 0;
}
else if (numero < 9)
{
return 1;
}
else if ((numero % 3) == 0)
{
return 0;
}
else
{
r = floor(sqrt(numero));
f = 5;
while (f <= r)
{
if ((numero % f) == 0)
{
return 0;
}
if ((numero % (f+2) == 0))
{
return 0;
}
f += 6;
}
return 1;
}
}
int factorizar(unsigned int numero, unsigned int factores[])
{
int i, ii, primes[LIMIT], cantprimos;
cantprimos = primosmenores(numero,primes);
/* for (i = 0; i < cantprimos; i++)
{
printf("%d es primo.\n", primes[i]);
}
*/// printf("Hay %d primos\n",cantprimos);
// printf("We're going in\n");
for (i = 0; i < cantprimos; ++i)
{
// printf("We're in!\n");
while ((numero != 1) && ((numero % primes[i]) == 0))
{
// printf("Estamos en el while con %d y %d\n",primes[i],numero);
numero = numero / primes[i];
// printf("Numero ahora vale %d\n",numero);
factores[i+1] += 1;
}
// printf("Salimos del while!\n");
}
/* for (i = 0; i < cantprimos; ++i)
{
printf("%d ", factores[i]);
}
*/
return cantprimos;
}