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.
i = 2: 3240 \to 1620 \to 810 \to 405, c = 3. Stampiamo 2^3*, poiché n = 405 > 1.
i = 3: 405 \to 135 \to 45 \to 15 \to 5, c = 4. Stampiamo 3^4*, poiché n = 5 > 1.
i = 4: 4 \cdot 4 > 5, il ciclo termina.
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 mathLa 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: continueIl numero è un divisore di . Nella variabile contiamo l'esponente con cui compare nella scomposizione di .
c = 0
while n % i == 0:
n //= i
c += 1Stampiamo 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)