#include <iostream>
using namespace std;
#include <sstream>
#include <cmath>
#define FOR(A,B) for(unsigned long long i=A;i<=B;i++)
#define repite(A) FOR(1,A)
string convertiratexto(unsigned long long a);
unsigned long long encontrarDiferenciaSiguientePrimo(unsigned long long numeroPrimoAnterior);
unsigned long long enesimoPrimo(unsigned long long n);
unsigned long long compuesto(unsigned long long n);
unsigned long long compuesto_par(unsigned long long n);
unsigned long long compuesto_impar(unsigned long long n);
unsigned long long nextPrimo(unsigned long long n);
unsigned long long funcionAuxFactorizacion(unsigned long long a, unsigned long long b);
string encuentraFactorizacion(unsigned long long n, unsigned long long primo, bool verificadorAux);
string factorizacion(unsigned long long n);
string if_encuentraFactorizacion(unsigned long long n, unsigned long long primo, bool verificadorAux);
string if_factorizacion(unsigned long long n);
float serie_inversa_de_primos(unsigned long long n);
int main() {
unsigned long long numero_primo, numero_compuesto, numero_compuesto_par, numero_compuesto_impar, numero_next_primo, numero_factorizacion, numero_if_factorizacion, numero_serie_inversa_primos, numero_menores;
cout << "Escribe un numero natural para encontrar el enesimo numero primo asociado al natural:" << endl;
cin >> numero_primo;
cin.ignore();
cin.clear();
cout << enesimoPrimo(numero_primo) << endl;
cout << "Escribe un numero natural para encontrar el enesimo numero compuesto asociado al natural:" << endl;
cin >> numero_compuesto;
cin.ignore();
cin.clear();
cout << compuesto(numero_compuesto) << endl;
cout << "Escribe un numero natural para encontrar el enesimo numero compuesto par asociado al natural:" << endl;
cin >> numero_compuesto_par;
cin.ignore();
cin.clear();
cout << compuesto_par(numero_compuesto_par) << endl;
cout << "Escribe un numero natural para encontrar el enesimo numero compuesto impar asociado al natural:" << endl;
cin >> numero_compuesto_impar;
cin.ignore();
cin.clear();
cout << compuesto_impar(numero_compuesto_impar) << endl;
cout << "Escribe un numero natural para encontrar el siguiente numero primo:" << endl;
cin >> numero_next_primo;
cin.ignore();
cin.clear();
cout << nextPrimo(numero_next_primo) << endl;
cout << "Escribe un numero natural para encontrar la factorizacion" << endl;
cin >> numero_factorizacion;
cin.ignore();
cin.clear();
cout << factorizacion(numero_factorizacion) << endl;
cout << "Escribe un numero natural para encontrar la factorizacion compuesto o verificar si es primo, (devuelve primo en caso de ser verdadero)" << endl;
cin >> numero_if_factorizacion;
cin.ignore();
cin.clear();
cout << if_factorizacion(numero_if_factorizacion) << endl;
cout << "Escribe un numero natural para encontrar la serie inversa de numeros primos" << endl;
cin >> numero_serie_inversa_primos;
cin.ignore();
cin.clear();
cout << serie_inversa_de_primos(numero_serie_inversa_primos) << endl;
cout << "Escribe un numero natural para encontrar los numeros primos menores al numero natural" << endl;
cin >> numero_menores;
cin.ignore();
cin.clear();
unsigned long long numero_primo_menores=2;
while (numero_primo_menores<numero_menores) {
cout << numero_primo_menores << endl;
if (numero_primo_menores==2) {
numero_primo_menores=3;
} else
{
numero_primo_menores+=encontrarDiferenciaSiguientePrimo(numero_primo_menores);
}
}
system("pause");
return 0;
}
string convertiratexto(unsigned long long a) {
stringstream b;
b << a;
return b.str();
}
unsigned long long encontrarDiferenciaSiguientePrimo(unsigned long long numeroPrimoAnterior) {
// numeroParaDividirPrimo empieza en 2, porque el número 2 es el primer número primo
// después, se le suma una diferencia para hallar el siguiente primo, para que
// numeroParaDividir sea siempre un número primo.
unsigned long long numeroParaDividir = 2;
// empieza la diferencia en 2, hasta hallar la diferencia.
unsigned long long diferencia = 2;
while (true) {
if (ceil(sqrt(numeroPrimoAnterior + diferencia)) <= numeroParaDividir && (numeroPrimoAnterior + diferencia) % numeroParaDividir != 0) {
return diferencia;
} else {
if ((numeroPrimoAnterior + diferencia) % numeroParaDividir != 0) {
if (numeroParaDividir == 2) {
numeroParaDividir = 3;
} else {
numeroParaDividir += encontrarDiferenciaSiguientePrimo(numeroParaDividir);
}
} else {
numeroParaDividir = 2;
diferencia += 2;
}
}
}
}
unsigned long long enesimoPrimo(unsigned long long n) {
if (n == 0) {
// Caso especial para n = 0 (podría considerarse un error)
return 0;
}
if (n == 1) {
return 2;
}
if (n == 2) {
return 3;
}
unsigned long long numeroLimit = n - 2;
unsigned long long sucesion = 3;
for (unsigned long long i = 1; i <= numeroLimit; i++) {
sucesion += encontrarDiferenciaSiguientePrimo(sucesion);
}
return sucesion;
}
unsigned long long compuesto(unsigned long long n) {
if (n == 0) {
// Caso especial para n = 0 (podría considerarse un error)
return 0;
}
unsigned long long primo=2;
unsigned long long solucion=2;
repite(n) {
if (i>1) {solucion++;}
while (solucion>=primo) {
while (solucion>primo) {
if (primo==2) {
primo=3;
} else {
primo+=encontrarDiferenciaSiguientePrimo(primo);
}
}
while (solucion==primo) {
if (primo==2) {
primo=3;
} else {
primo+=encontrarDiferenciaSiguientePrimo(primo);
}
solucion++;
}
}
}
return solucion;
}
unsigned long long compuesto_par(unsigned long long n) {
if (n == 0) {
// Caso especial para n = 0 (podría considerarse un error)
return 0;
}
return 2*n+2;
}
unsigned long long compuesto_impar(unsigned long long n) {
if (n == 0) {
// Caso especial para n = 0 (podría considerarse un error)
return 0;
}
unsigned long long primo=2;
unsigned long long solucion=3;
repite(n) {
if (i>1) {solucion+=2;}
while (solucion>=primo) {
while (solucion>primo) {
if (primo==2) {
primo=3;
} else {
primo+=encontrarDiferenciaSiguientePrimo(primo);
}
}
while (solucion==primo) {
if (primo==2) {
primo=3;
} else {
primo+=encontrarDiferenciaSiguientePrimo(primo);
}
solucion+=2;
}
}
}
return solucion;
}
unsigned long long nextPrimo(unsigned long long n) {
if (n==0 || n==1) {
return 2;
} else
if (n%2==0) {
return (n-1)+encontrarDiferenciaSiguientePrimo(n-1);
} else
{
return n+encontrarDiferenciaSiguientePrimo(n);
}
}
//
unsigned long long funcionAuxFactorizacion(unsigned long long a, unsigned long long b) {
if (a==b) {
return 1;
}
if (a<b) {
return 0;
}
{
unsigned long long solucion=1, digit=9, Aux=1, potencia=pow(b,solucion);
while (a%potencia>=pow(10,Aux)*digit) {
cout << "ii: " << solucion << endl;
solucion+=pow(10,Aux)*digit;
if(digit>1) {
digit--;
}
if(digit==1) {
Aux++;
digit=9;
}
potencia=pow(b,solucion);
}
while (a%potencia==0) {
solucion++;
potencia=pow(b,solucion);
}
solucion--;
return solucion;
}
}
string encuentraFactorizacion(unsigned long long n, unsigned long long primo, bool verificadorAux) {
string solucion="";
while(n>0) {
if (verificadorAux==primo) {
if (verificadorAux==true) {
solucion = convertiratexto(n)+" es primo";
} else
{
solucion = solucion+convertiratexto(n);
}
n=0;
} else
{
if (primo>ceil(sqrt(n))) {
if (verificadorAux==true) {
solucion = convertiratexto(n)+" es primo";
} else
{
solucion = solucion+convertiratexto(n);
}
n=0;
} else
{
if (n%primo==0) {
if (funcionAuxFactorizacion(n,primo)>1) {
if (primo==2) {
if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),3, false)=="1") {
solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo));
n=0;
verificadorAux=false;
} else
{
solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo))+"*";
n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
primo=3;
verificadorAux=false;
}
} else {
if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),primo+encontrarDiferenciaSiguientePrimo(primo), false)=="1") {
solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo));
n=0;
verificadorAux=false;
} else
{
solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo))+"*";
n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
primo+=encontrarDiferenciaSiguientePrimo(primo);
verificadorAux=false;
}
}
} else {
if (primo==2) {
if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),3, false)=="1") {
solucion = solucion+convertiratexto(primo);
verificadorAux=0;
verificadorAux=false;
} else
{
solucion = solucion+convertiratexto(primo)+"*";
n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
primo=3;
verificadorAux=false;
}
} else {
if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),primo+encontrarDiferenciaSiguientePrimo(primo), false)=="1") {
solucion = solucion+convertiratexto(primo);
n=0;
verificadorAux=false;
} else
{
solucion = solucion+convertiratexto(primo)+"*";
n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
primo+=encontrarDiferenciaSiguientePrimo(primo);
verificadorAux=false;
}
}
}
} else {
if (n>primo && n%primo!=0) {
if (primo==2) {
primo=3;
} else {
primo+=encontrarDiferenciaSiguientePrimo(primo);
}
} else {
solucion = "1^1";
n=0;
}
}
}
}
}
return solucion;
}
string factorizacion(unsigned long long n) {
if (n == 0) {
// Caso especial para n = 0 (podría considerarse un error)
return "0";
}
if (n==1) {
return "1";
}
if (n==2) {
return "2 es primo";
}
return encuentraFactorizacion(n, 2, true);
}
string if_encuentraFactorizacion(unsigned long long n, unsigned long long primo, bool verificadorAux) {
string solucion="";
while(n>0) {
if (verificadorAux==primo) {
if (verificadorAux==true) {
solucion = "primo";
} else
{
solucion = solucion+convertiratexto(n);
}
n=0;
} else
{
if (primo>ceil(sqrt(n))) {
if (verificadorAux==true) {
solucion = "primo";
} else
{
solucion = solucion+convertiratexto(n);
}
n=0;
} else
{
if (n%primo==0) {
if (funcionAuxFactorizacion(n,primo)>1) {
if (primo==2) {
if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),3, false)=="1") {
solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo));
n=0;
verificadorAux=false;
} else
{
solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo))+"*";
n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
primo=3;
verificadorAux=false;
}
} else {
if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),primo+encontrarDiferenciaSiguientePrimo(primo), false)=="1") {
solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo));
n=0;
verificadorAux=false;
} else
{
solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo))+"*";
n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
primo+=encontrarDiferenciaSiguientePrimo(primo);
verificadorAux=false;
}
}
} else {
if (primo==2) {
if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),3, false)=="1") {
solucion = solucion+convertiratexto(primo);
verificadorAux=0;
verificadorAux=false;
} else
{
solucion = solucion+convertiratexto(primo)+"*";
n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
primo=3;
verificadorAux=false;
}
} else {
if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),primo+encontrarDiferenciaSiguientePrimo(primo), false)=="1") {
solucion = solucion+convertiratexto(primo);
n=0;
verificadorAux=false;
} else
{
solucion = solucion+convertiratexto(primo)+"*";
n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
primo+=encontrarDiferenciaSiguientePrimo(primo);
verificadorAux=false;
}
}
}
} else {
if (n>primo && n%primo!=0) {
if (primo==2) {
primo=3;
} else {
primo+=encontrarDiferenciaSiguientePrimo(primo);
}
} else {
solucion = "1^1";
n=0;
}
}
}
}
}
return solucion;
}
string if_factorizacion(unsigned long long n) {
if (n == 0) {
// Caso especial para n = 0 (podría considerarse un error)
return "numero no permitido";
}
if (n==1) {
return "1";
}
if (n==2) {
return "primo";
}
return if_encuentraFactorizacion(n,2, true);
}
float serie_inversa_de_primos(unsigned long long n) {
unsigned long long primo=2;
float serie=0;
FOR(1,n) {
if (i!=1) {
if (primo==2) {
primo=3;
} else
{
primo+=encontrarDiferenciaSiguientePrimo(primo);
}
}
serie=serie+(1/(float)primo);
}
return serie;
}