#include <stdio.h>
#include <math.h>
#include <stdint.h>
#define LIMIT 650000
//Sumo los exponentes+1 de la factorizacin
int primosmenores(unsigned long int numero, unsigned long int primos[], int minimo);
int esprimo(unsigned long int numero);
void factorizar(unsigned long int numero, unsigned long int factores[], unsigned long int primos[], int limite);
void main()
{
int cantdivisores, nuevacantprimos, cantprimos;
unsigned long int numero, factores[LIMIT], primos[LIMIT], i, ii;
for (i = 0; i < LIMIT; i++)
{
factores[i] = 0;
primos[i] = 0;
// printf("%d\n", i);
}
numero = 0;
primos[0] = 2;
cantprimos = 1;
for (i = 1; cantdivisores != 500; i++)
{
for (ii = 0; ii < LIMIT; ii++)
{
factores[ii] = 0;
}
numero += i; //Primero calculo el numero
cantprimos = primosmenores(numero,primos,cantprimos); // Calculo los primos menores
// printf("\n%lld es el numero triangulo (n %lld) y tiene %d primos menores.\n", numero, i, cantprimos);
factorizar(numero,factores,primos,cantprimos); //Factorizo al numero con los primos que lo conforman
cantdivisores = 1;
for (ii = 0; ii < cantprimos; ii++)
{
while ((factores[ii] == 0) && (ii < cantprimos))
{
ii++;
}
// printf("El factor numero %d es %ld.\n", i, factores[i]);
cantdivisores = cantdivisores*(factores[ii]+1);
}
printf("\n%ld es el numero triangulo (n %ld) y tiene %d divisores y %d primos menores.\n", numero, i, cantdivisores, cantprimos);
// printf("El numero %d tiene %d divisores.\n", numero,cantdivisores);
}
/* for (i = 0; i < cantprimos; i++)
{
printf("%d es primo.\n", primos[i]);
}
*/}
int primosmenores(unsigned long int numero, unsigned long int primos[], int minimo)
{
int i, ii;
for ((i = primos[minimo-1]+1) && (ii = minimo); i <= numero; i++)
{
if (esprimo(i) == 1)
{
primos[ii] = i;
ii++;
// printf("%d es primo.\n", i);
}
}
return ii;
}
int esprimo(unsigned long 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;
}
}
void factorizar(unsigned long int numero, unsigned long int factores[], unsigned long int primos[], int limite)
{
int i;
for (i = 0; i < limite; ++i)
{
// printf("We're in!\n");
while ((numero != 1) && ((numero % primos[i]) == 0))
{
// printf("Estamos en el while con %d y %d\n",primes[i],numero);
numero = numero / primos[i];
// printf("Numero ahora vale %d\n",numero);
factores[i] += 1;
}
// printf("Salimos del while!\n");
}
/* for (i = 0; i < limite; ++i)
{
printf("%ld ", factores[i]);
}
*/
}