Derterminar si un numero es Primo
Como se podria crear una lista con todos los primos absolutos desde 1 hasta un numero en cuestion?
Bienvenido al mundo de los numeros primos, la respuesta te la estas dando tu mismo.
Primero necesitas determinar los numero Primos que existen desde 2 hasta el numero en cuestion.
Una vez definida esa lista necesitas procesar los digitos de cada uno de esos numeros y detenerminar si suma es un numero primo hasta llegar a un solo digito.
Por lo cual tu primer problema es detenerminar si un numero es primo o no.
Metodos para lo mismo hay muchos, desde exhaustivos, probabilisticos.
Lo ideal para estar 100% seguro de que es primo o no, es ir contruyendo una lista de numeros primos, y probar todos los numero siguientes contra esa lista. Por ejemplo emepzamos con el 2, primer numero primo.
Luego 3, ¿es tres divisible entre 2? en otras palabras ¿ 3 modulo 2 es 0 ? Si la respuesta a esta ultma es negativa podemos agregar 3 a nuestra lista de numeros primos.
Luego 4, ¿Es cuatro divisible entre 2? si 4 % 2 es 0, entonces 4 No es numero primo.
Luego 5 es cinco divisible entre 2, como 5%2 no es 0, y como 5 % 3 no es 0, entonces agregamos 5 a nuestra lista de numeros primos.
Asi sucedivamnete hasta el numero N, entonces ya con la lista definida de numeros primos, procedes a simplificar la suma de sus digiitos como mencionaste hasta llegar a un numero de un solo digito, con lo cual tienes tu problema resulto.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
unsigned int *primos = NULL;
int n_primos = 0;
int agregar_numero(unsigned int numero);
int es_primo(unsigned int numero);
int es_primo_absoluto(unsigned int numero);
int main() {
unsigned int i,j;
unsigned int N = 0xFFFFFF;
agregar_numero(2);
printf("El numero %i es primo y ademas es Primo Absoluto\n",2); i = 3;
while(i < N) {
j = 0;
if(es_primo(i)) {
printf("El numero %i es primo\n",i
); agregar_numero(i);
if(es_primo_absoluto(i)){
printf("El numero %i es primo y ademas es Primo Absoluto\n",i
); }
}
i+=2; //Vamos de 2 en 2 por que no necesitamos evaluar los numeros pares, es decir solo 3, 5, 7, 9 .... Asi evistamos llamdas inecesarias a la funcion es_primo, haciendo nuestro programa un tanto mas eficiente
}
return 0;
}
int agregar_numero(unsigned int numero) {
primos
= realloc(primos
,sizeof(int) * (n_primos
+1)); primos[n_primos] = numero;
n_primos++;
}
int es_primo(unsigned int numero) { //Esta funcion solo determina correctamente si es primo o no, cuando ya hemos EVALUADO todos los numeros PREVIOS a este numero
int es_primo = 1;
int j = 0;
while(j < n_primos && primos[j] < (numero/2) && es_primo) {
es_primo = (numero % primos[j++] == 0) ? 0 : 1 ;
}
return es_primo;
}
int es_primo_absoluto(unsigned int numero) {
int retornar;
char temporal[20] = {0};
unsigned suma = 0;
int len,i;
if(len == 1) {
switch(numero) {
case 2:
case 3:
case 5:
case 7:
retornar = 1;
break;
default:
retornar = 0;
break;
}
}
else {
i = 0;
while(i < len) {
suma = temporal[i++] - '0';
}
if(es_primo(suma)) {
retornar = es_primo_absoluto(suma);
}
else {
retornar = 0;
}
}
return retornar;
}
Saludos