The Lesson of Mathematics#572

The Lesson of Mathematics (Editoriale)

Il problema richiede di scomporre il numero in fattori primi, ossia di rappresentarlo nella forma n = p_1^{a_1} \cdot p_2^{a_2} \cdot ... \cdot p_k^{a_k}, dove p_1 < p_2 < ... < p_k — sono numeri primi. Ogni divisore primo p_i viene stampato insieme al suo esponente a_i, se a_i > 1.

Scorreremo i possibili divisori in ordine crescente, a partire da . Se divide , dividiamo per finché la divisione risulta esatta, contando il numero di divisioni . Il valore ottenuto è proprio l'esponente con cui compare nella scomposizione. Successivamente stampiamo , se c = 1, oppure i^c, se c > 1.

La ricerca dei divisori va effettuata fino a \sqrt{n}. Se il numero non ha divisori nell'intervallo da a \sqrt{n}, allora è primo. Pertanto, al termine del ciclo, il valore corrente di è uguale a oppure è un numero primo — l'ultimo fattore della scomposizione, che va anch'esso stampato. Un tale fattore "grande" può essere soltanto uno: il prodotto di due fattori maggiori di \sqrt{n} supererebbe .

Esempio. Consideriamo n = 3240.

Il resto n = 5 > 1 è un fattore primo, stampiamo .

Risposta: 2^3*3^4*5.

Implementazione dell'algoritmo

La funzione factor esegue la scomposizione del numero in fattori primi.

void factor(int n)
{
  for (int i = 2; i <= sqrt(n); i++)
  {
    if (n % i) continue;

Il numero è un divisore di . Nella variabile contiamo l'esponente con cui compare nella scomposizione di .

    int c = 0;
    while (n % i == 0) n /= i, c++;

Stampiamo il fattore i^c. Se l'esponente del fattore è c = 1, stampiamo solo . Altrimenti, stampiamo il fattore con il suo esponente.

    if (c > 1) printf("%d^%d",i,c); else printf("%d",i);

Se il numero non è ancora completamente scomposto (n > 1), stampiamo il segno di moltiplicazione.

    if (n > 1) printf("*");
  }

Se, al termine del ciclo, il valore di è maggiore di , allora è primo.

  if (n > 1) printf("%d",n);
  printf("\n");
}

Parte principale del programma. Leggiamo il numero in ingresso e avviamo la sua fattorizzazione.

scanf("%d",&n);
factor(n);

Implementazione in Python

import math

La funzione factor esegue la scomposizione del numero in fattori primi.

def factor(n):
  for i in range(2, math.isqrt(n) + 1):
    if n % i: continue

Il numero è un divisore di . Nella variabile contiamo l'esponente con cui compare nella scomposizione di .

    c = 0
    while n % i == 0:
      n //= i
      c += 1

Stampiamo il fattore i^c. Se l'esponente del fattore è c = 1, stampiamo solo . Altrimenti, stampiamo il fattore con il suo esponente.

    if c > 1: print(i,"^",c, sep = "", end="")
    else: print(i, end="")

Se il numero non è ancora completamente scomposto (n > 1), stampiamo il segno di moltiplicazione.

    if n > 1: print("*", end="")

Se, al termine del ciclo, il valore di è maggiore di , allora è primo.

  if n > 1: print(n)
  else: print()

Parte principale del programma. Leggiamo il numero in ingresso e avviamo la sua fattorizzazione.

n = int(input())
factor(n)