Test de la Conjetura de Goldbach

Jesús Gacías Franco

/* Este programa cuenta y escribe por pantalla las parejas de números primos que, sumados ambos miembros de la pareja, dan un cierto número par introducido por el usuario. */

#include <iostream>
#include <cmath>
using namespace std;

/*Esta función usa un algoritmo clásico para determinar si un número impar es primo o no. Retorna true si lo es, y false si no.*/

bool impar_es_primo(int x)
{
float raiz=sqrt(x);

if(x==1) return false;

for(int i=3; i<=raiz; i+=2)
{
if(x%i==0)
return false;
}

return true;
}

//Esta otra función imprime una pareja de números junto con otro, que será su suma.

void imprimir_pareja (int a, int b, int c)
{
cout << a << ” y ” << b << ” son primos que suman ” << c << “\n”;
}

int main()
{

/*Usamos enteros largos para poder usar este programa con numeros pares grandes (no se recomienda, aún así, introducir números más grandes que 1,000,000,000)*/

long long int x, eje_sim, prim1, prim2, cont=0;

cout << “La conjetura de Goldbach -no demostrada- afirma que todo numero par \nestrictamente mayor que 2 es la suma de al menos una pareja de primos.\n”;
cout << “Este programa obtiene distintas parejas de primos que sumadas dan un numero par introducido por el usuario.\n\n”;

/*El siguiente bucle volverá a pedir un x al usuario si no cumple que sea par ni mayor que dos.*/

do {
cout << “Dame num par: “;
cin>> x;
cout << “\n”;
}while (x<=2 || x%2!=0);

/*El número 4 es el único par cuya suma son dos primos pares (2 y 2). Este fragmento de codigo analiza ese caso particular y detiene el programa.*/

if (x==4) {
cout << “2 y 2 son primos que suman 4”;
cout << “\nHay una pareja de primos que suma el numero 4. \n\n”;
return 0;
}

/* Este proceso toma un eje de simetría (x/2) con respecto al cual se distribuyen todos los números que sumados dan el número x. El programa comprueba si el eje de simetría es par o impar, y en función de eso comenzará a tomar unos números u otros. */

eje_sim=x/2;

if (eje_sim%2==0) {
prim1=eje_sim-1;
prim2=eje_sim+1;
}
else {
prim1=eje_sim;
prim2=eje_sim;
}

/*En este bucle,se va comprobando si dos numeros candidatos son ambos primos o no. Tan solo imprime la pareja si ambos lo son. Después de cada comprobación, se aumenta de dos cada candidato a primo. Así tomamos siempre candidatos impares.*/

while(prim1>1){
if (impar_es_primo(prim1)==true)
if (impar_es_primo(prim2)==true) {
imprimir_pareja(prim1, prim2, x);
cont++;
}
prim1-=2;
prim2+=2;
}

/*Si solo hay una pareja de primos, se devuelve la frase en singular. Si hay varias, la frase se devuelve en plural.*/

if (cont==1)
cout << “\nHay una pareja de primos que suma el numero ” << x << “.\n\n”;
else
cout << “\nHay ” << cont << ” parejas distintas de primos que suman el numero ” << x << “.\n\n”;

return 0;
}

Acerca de programacion1z

Curso de introducción a la programación en C
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s