🔢 Matemáticas

Problemas matemáticos aparecen en todos los niveles. Los básicos son fáciles de resolver, los avanzados requieren conocer algoritmos específicos.

🎯 Números primos

🛑
Aparece en TODAS las competiciones. Memoriza esta función.
def es_primo(n):
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    for i in range(3, int(n**0.5) + 1, 2):
        if n % i == 0:
            return False
    return True
💡
¿Por qué hasta la raíz cuadrada?
Si n = a × b, uno de los factores debe ser ≤ √n. No necesitas comprobar más allá.

Encontrar primos en un rango

# Primos entre 1 y 100
primos = [n for n in range(2, 101) if es_primo(n)]

📐 Divisores

def divisores(n):
    divs = []
    for i in range(1, int(n**0.5) + 1):
        if n % i == 0:
            divs.append(i)
            if i != n // i:
                divs.append(n // i)
    return sorted(divs)

# divisores(12) → [1, 2, 3, 4, 6, 12]

🔄 MCD y MCM

import math

# Máximo Común Divisor
math.gcd(12, 18)   # 6

# Mínimo Común Múltiplo (Python 3.9+)
math.lcm(4, 6)     # 12

# MCM manual (por si no está disponible)
def mcm(a, b):
    return a * b // math.gcd(a, b)

➗ El módulo (%)

# Último dígito
n % 10          # 1234 % 10 = 4

# ¿Es par?
n % 2 == 0

# ¿Es múltiplo de X?
n % x == 0

# Dígitos de un número
while n > 0:
    digito = n % 10
    n = n // 10

📊 Fórmulas comunes

Fórmula Código
Área triángulo base * altura / 2
Área círculo math.pi * r ** 2
Pitágoras c = (a**2 + b**2) ** 0.5
Suma 1 a N n * (n + 1) // 2
Factorial math.factorial(n)
Interés compuesto capital * (1 + tasa) ** años

Fórmula de Herón (área de triángulo con 3 lados)

import math

def area_heron(a, b, c):
    s = (a + b + c) / 2  # semiperímetro
    return math.sqrt(s * (s-a) * (s-b) * (s-c))

🔢 Conversiones de base

# Decimal a binario/octal/hex
bin(10)    # '0b1010'
oct(10)    # '0o12'
hex(10)    # '0xa'

# Sin prefijo
bin(10)[2:]  # '1010'

# Otras bases a decimal
int('1010', 2)   # 10 (binario)
int('ff', 16)     # 255 (hex)

📏 Suma de dígitos

def suma_digitos(n):
    total = 0
    while n > 0:
        total += n % 10
        n = n // 10
    return total

# Versión corta
sum(int(d) for d in str(n))

🔄 Fibonacci

def fibonacci(n):
    if n <= 1:
        return n
    a, b = 0, 1
    for _ in range(n - 1):
        a, b = b, a + b
    return b

# Lista de N términos
def fib_lista(n):
    fibs = [0, 1]
    for i in range(2, n):
        fibs.append(fibs[-1] + fibs[-2])
    return fibs[:n]