elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Valor primo absoluto C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Valor primo absoluto C++  (Leído 1,745 veces)
Morx

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Valor primo absoluto C++
« en: 8 Noviembre 2018, 16:00 pm »

Buenas.
Me encontre con el ejercicio siguiente:
PROBLEMA: Definiremos número primo absoluto a un número primo que las sucesivas sumas de sus dígitos (hasta llegar a un número de un solo dígito) también son números primos.

EJEMPLO: 29 es un número primo
La suma de sus dígitos 2 + 9 = 11 también es un número primo
La suma de los dígitos de 11 1 + 1 = 2 también es un número primo
Por lo tanto, 29 es un número primo absoluto.
Evidentemente los números primos de una sola cifra son todos primeros absolutos.

Como se podria crear una lista con todos los primos absolutos desde 1 hasta un numero en cuestion?


Citar
#include <iostream>

using namespace std;

unsigned suma_digitos (unsigned n){
    unsigned suma=0;
    cin >> n;
    while (n>0){
        suma= suma+n%10;
        n= n/10;}
}


bool primero(int n){
    if(n==1||n==2)
        return true;

    for(int i=2;i<n/2;i++){
          if(n%i==0)
              return false;
    }

   return true;
}

int main (){

    unsigned n;

    cout << "Digite un numero " <<endl;
    cin >> n;

    if (primero(n) and suma_digitos(primero(n))) cout << suma_digitos(n);
        else cout << suma_digitos(n);


    return 0;
}


En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Valor primo absoluto C++
« Respuesta #1 en: 8 Noviembre 2018, 17:17 pm »

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.

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. unsigned int *primos = NULL;
  6. int n_primos = 0;
  7.  
  8. int agregar_numero(unsigned int numero);
  9. int es_primo(unsigned int numero);
  10. int es_primo_absoluto(unsigned int numero);
  11.  
  12. int main() {
  13. unsigned int i,j;
  14. unsigned int N = 0xFFFFFF;
  15. agregar_numero(2);
  16. printf("El numero %i es primo y ademas es Primo Absoluto\n",2);
  17. i = 3;
  18. while(i < N) {
  19. j = 0;
  20. if(es_primo(i)) {
  21. printf("El numero %i es primo\n",i);
  22. agregar_numero(i);
  23. if(es_primo_absoluto(i)){
  24. printf("El numero %i es primo y ademas es Primo Absoluto\n",i);
  25. }
  26. }
  27. 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
  28. }
  29. return 0;
  30. }
  31.  
  32. int agregar_numero(unsigned int numero) {
  33. primos = realloc(primos,sizeof(int) * (n_primos+1));
  34. primos[n_primos] = numero;
  35. n_primos++;
  36. }
  37.  
  38. 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
  39. int es_primo = 1;
  40. int j = 0;
  41. while(j < n_primos && primos[j] < (numero/2) && es_primo) {
  42. es_primo = (numero % primos[j++] == 0) ? 0 : 1 ;
  43. }
  44. return es_primo;
  45. }
  46.  
  47. int es_primo_absoluto(unsigned int numero) {
  48. int retornar;
  49. char temporal[20] = {0};
  50. unsigned suma = 0;
  51. int len,i;
  52. sprintf(temporal,"%u",numero);
  53. len = strlen(temporal);
  54. if(len == 1) {
  55. switch(numero) {
  56. case 2:
  57. case 3:
  58. case 5:
  59. case 7:
  60. retornar = 1;
  61. break;
  62. default:
  63. retornar = 0;
  64. break;
  65. }
  66. }
  67. else {
  68. i = 0;
  69. while(i < len) {
  70. suma = temporal[i++] - '0';
  71. }
  72. if(es_primo(suma)) {
  73. retornar = es_primo_absoluto(suma);
  74. }
  75. else {
  76. retornar = 0;
  77. }
  78. }
  79. return retornar;
  80. }
  81.  

Saludos



« Última modificación: 8 Noviembre 2018, 19:42 pm por AlbertoBSD » En línea

Morx

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Valor primo absoluto C++
« Respuesta #2 en: 10 Noviembre 2018, 18:45 pm »

Derterminar si un numero es Primo


Gracias Alberto por la ayuda. En este momento llevo hecho este codigo. Me faltaria mostrar todos los numeros primos absolutos hasta un numero en cuestion.
EJEMPLO:
INTRODUCE UN MAXIMO: 100
2 3 5 7 11 23 29 41 43 47 61 83.

Código:
#include <iostream>

using namespace std;

bool es_primo(unsigned n){
    bool primo=n==2;
    if(n>2){
    unsigned divisor=2;
    while(n%divisor!=0 and divisor*divisor<n) divisor++;
    primer=n%divisor!=0;}
    return primo;
}

unsigned suma_digitos (unsigned n){
    int suma=0;
    while (n>0){
        suma = suma + n%10;
        n = n/10;}
        return suma;
    }



int main()
{
    unsigned numero, suma;

    cout << "Digite un numero: ";
    cin >> numero;

    suma = suma_digitos(numero);

    while (suma >= 10){
        cout << suma<< endl;
        suma=suma_digitos(suma);
        cout << suma<< endl;
    }



    return 0;
}
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Valor primo absoluto C++
« Respuesta #3 en: 16 Noviembre 2018, 04:54 am »

Ya tienes lo más complicado. Tienes una función que te dice si un número es primo y tienes otra función que te devuelve la suma de los dígitos de un número.

Cuidado con esto en <es_primo(unsigned n){}>; es primo, no primer:
Código:
primer=n%divisor!=0; 

Solo te falta hacer un bucle como el del main, pero en vez de mostrar la suma de los dígitos, tienes que comprobar que el número siga siendo primo. Entonces en el bucle mientras el número sea >= 10 y el número sea primo aboluto: si el número no es primo, entonces no es primo absoluto, sino el número es igual a la suma de sus cifras. Un ejemplo de cómo quedaría es:

Código
  1. bool isAbsolutePrime(unsigned num){
  2. bool absPrime = isPrime(num);
  3. while(num >= 10 && absPrime){
  4. num = sumDigits(num);
  5. if(!isPrime(num))
  6. absPrime = false;
  7. }
  8. return absPrime;
  9. }

Y en el <main> puedes ejecutarlo como (los nombres de las funciones son distintos pero su contenido no).
Tendrías que adaptarlo a tu código o simplemente ahorrarte la función <isAbsolutePrime(unsigned)> y hacerlo en el <main> directamente.

Código
  1. int main(){
  2.  
  3. unsigned max;
  4. cout << "Introduce el limite maximo: ";
  5. cin >> max;
  6.  
  7. for(size_t i = 0; i < max; i++)
  8. if(isAbsolutePrime(i))
  9. cout << i << "  ";
  10.  
  11. cout << endl;
  12. return 0;
  13. }
 
« Última modificación: 16 Noviembre 2018, 04:59 am por YreX-DwX » En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Atheros, ¿poder absoluto?
Materiales y equipos
WildFroVII 6 3,369 Último mensaje 5 Agosto 2008, 02:30 am
por pianista
Valor absoluto en php [Solucionado]
PHP
:ohk<any> 2 7,224 Último mensaje 25 Mayo 2011, 04:29 am
por Nakp
VALOR ABSOLUTO DE UN NUMERO
Programación C/C++
inquilin@19 5 20,153 Último mensaje 17 Diciembre 2011, 13:04 pm
por inquilin@19
Como Obtener valor de un textbox, desde un valor, hasta otro valor [VB6]
Programación Visual Basic
revenge1252 4 6,302 Último mensaje 17 Julio 2012, 09:38 am
por BlackZeroX
Valor absoluto
Dudas Generales
Giankaa 5 3,806 Último mensaje 28 Febrero 2016, 23:19 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines