Números Primos y Factores Primos: Algoritmos Fundamentales

Fundamentos Matemáticos:

Números Primos: Un número natural mayor que 1 que solo es divisible por 1 y por sí mismo se denomina número primo. Los números que no cumplen esta propiedad se llaman compuestos (el 1 no se considera ni primo ni compuesto).

Factores Primos: Son los números primos que dividen exactamente a un entero positivo dado.

Máximo Común Divisor (MCD): El mayor divisor común entre dos o más enteros positivos.

Propiedad Fundamental: Excepto el 1, el divisor más pequeño de cualquier número siempre es un número primo.

Problema 1: Verificcaión de Primos mediante División Experimental

Se proporcionan n enteros positivos ai. Determinar si cada número es primo.

Entrada: Primera línea con n, seguida de n líneas con los valores ai.

Salida: n líneas indicando "Yes" si es primo, "No" en caso contrario.

Restricciones: 1 ≤ n ≤ 100, 1 ≤ ai ≤ 2^31 − 1

Implementación:

#include <iostream>
#include <cmath>

bool verificarPrimo(int valor)
{
    if (valor < 2) return false;
    int limite = static_cast<int>(sqrt(valor));
    for (int divisor = 2; divisor <= limite; divisor++)
    {
        if (valor % divisor == 0)
            return false;
    }
    return true;
}

int main()
{
    int cantidad;
    std::cin >> cantidad;
    
    for (int i = 0; i < cantidad; i++)
    {
        int numero;
        std::cin >> numero;
        std::cout << (verificarPrimo(numero) ? "Yes" : "No") << std::endl;
    }
    return 0;
}

Problema 2: Descomposición en Factores Primos

Para n enteros positivos dados, descomponer cada uno en sus factores primos. Mostrar cada factor junto con su exponente.

Entrada: Primera línea con n, seguida de n líneas con los valores ai.

Salida: Para cada número, mostrar factor y exponente en líneas separadas. Dejar una línea en blanco después de cada caso.

Restricciones: 1 ≤ n ≤ 100, 2 ≤ ai ≤ 2×10^9

Implementación:

#include <iostream>

void descomponer(int numero)
{
    for (int factor = 2; factor <= numero / factor; factor++)
    {
        if (numero % factor == 0)
        {
            int exponente = 0;
            while (numero % factor == 0)
            {
                numero /= factor;
                exponente++;
            }
            std::cout << factor << " " << exponente << std::endl;
        }
    }
    if (numero > 1)
        std::cout << numero << " 1" << std::endl;
    std::cout << std::endl;
}

int main()
{
    int cantidad;
    std::cin >> cantidad;
    
    while (cantidad--)
    {
        int numero;
        std::cin >> numero;
        descomponer(numero);
    }
    return 0;
}

Problema 3: Criba para Ancontrar Números Primos

Dado un número n, determinar cuántos primos existen entre 1 y n.

Entrada: Un solo entero n.

Salida: Un entero con la cantidad de primos en el rango [1, n].

Restricciones: 1 ≤ n ≤ 10^6

Implementación - Método Básico O(nlogn):

#include <iostream>

const int MAXIMO = 1000010;

int listaPrimos[MAXIMO];
int contador = 0;
bool marcado[MAXIMO];

void generarPrimos(int limite)
{
    for (int i = 2; i <= limite; i++)
    {
        if (!marcado[i])
            listaPrimos[contador++] = i;
        
        for (int j = i + i; j <= limite; j += i)
            marcado[j] = true;
    }
}

int main()
{
    int n;
    std::cin >> n;
    generarPrimos(n);
    std::cout << contador << std::endl;
    return 0;
}

Método de Eratóstenes O(nloglogn):

void generarPrimos(int limite)
{
    for (int i = 2; i <= limite; i++)
    {
        if (!marcado[i])
        {
            listaPrimos[contador++] = i;
            for (int j = i + i; j <= limite; j += i)
                marcado[j] = true;
        }
    }
}

Criba Lineal O(n):

void generarPrimos(int limite)
{
    for (int i = 2; i <= limite; i++)
    {
        if (!marcado[i])
            listaPrimos[contador++] = i;
        
        for (int j = 0; listaPrimos[j] <= limite / i; j++)
        {
            marcado[listaPrimos[j] * i] = true;
            if (i % listaPrimos[j] == 0)
                break;
        }
    }
}

Problema 4: Cálculo del Máximo Común Divisor

Dados n pares de enteros positivos (ai, bi), determinar el MCD de cada par.

Entrada: Primera línea con n, seguida de n líneas con pares ai bi.

Salida: n líneas con el MCD de cada par.

Restricciones: 1 ≤ n ≤ 10^5, 1 ≤ ai, bi ≤ 2×10^9

Implementación con Algoritmo de Euclides:

#include <iostream>

int calcularMCD(int a, int b)
{
    return (b == 0) ? a : calcularMCD(b, a % b);
}

int main()
{
    int cantidad;
    std::cin >> cantidad;
    
    while (cantidad--)
    {
        int a, b;
        std::cin >> a >> b;
        std::cout << calcularMCD(a, b) << std::endl;
    }
    return 0;
}

Versión Alternativa usando STL:

#include
#include

int main()
{
int cantidad;
std::cin >> cantidad;

while (cantidad--)
{
int a, b;
std::cin >> a >> b;
std::cout << std::gcd(a, b) << std::endl;
}
return 0;
}

Etiquetas: cpp algoritmos matemáticas numeros-primos criba-eratosthenes

Publicado el 6-26 20:51