#include #include #define LIMIT 500000 //Busco todos los primos que puedan dividir al numero => primo <= (numero/2) //Factorizo al numero con los primos que lo conforman //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 i, ii, cantdivisores, nuevacantprimos, cantprimos; unsigned long int factores[LIMIT], numero, primos[LIMIT]; for (i = 0; i < LIMIT; i++) { factores[i] = 0; primos[i] = 0; } numero = 0; primos[0] = 2; cantprimos = 1; for (i = 1; i <= LIMIT; 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%ld es el numero triangulo (n %d) y tiene %d primos menores.\n", numero, i, cantprimos); factorizar(numero,factores,primos,cantprimos); cantdivisores = 1; for (ii = 0; ii < cantprimos; ii++) { while ((factores[ii] == 0) && (i < 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); } /* 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("%d ", factores[i]); } */ }