DIVISORI DI UN NUMERO IN C

di il
7 risposte

DIVISORI DI UN NUMERO IN C

Ciao a tutti, scusate il disturbo. Sto cercando di fare un programma in c per contare i divisori di un numero e mi sono venute in mente due idee:
1. creare un ciclo for che divida n per 2 e se il resto è 0 vuol dire che è divisore, aggiungendo una variabile contatore io posso sapere quanti divisori ci sono. Ma questa idea va bene fino a un certo punto: se io inserisco un numero come 1 miliardo il programma cicla 1 miliardo di volte e non riesce a farlo in un tempo decente (per me il limite è 5000ms). quindi idea da scartare.
2. se io trovassi i fattori primi di quel numero, potrei, aumentando di uno ogni esponente della fattorizzazione e moltiplicandoli, trovare il numero di divisori. es.
12=(2^2)*3
esponente di 2 più 1= 3;
esponente di 3 più 1=2;
3*2=6(numero di divisori di 12)
Quindi, per sapere qual è il NUMERO DEI DIVISORI di un dato numero dobbiamo SCOMPORLO in FATTORI PRIMI, AUMENTARE di UNA UNITA' ognuno degli ESPONENTI di tali fattori primi e fare il PRODOTTO dei numeri ottenuti.
IL PROBLEMA?
Non ho la più pallida idea di come farlo in c, ho già provato in tutti i modi. GRAZIE A CHIUNQUE MI AIUTASSE.

7 Risposte

  • Re: DIVISORI DI UN NUMERO IN C

    Ciao,
    personalmente partirei da una soluzione più semplice:
    • prendi in ingresso un numero 'N'
    • dichiari un contatore 'cont'
    • fai un ciclo da 1 a 'N'
    • per ogni valore controlli se si tratta di un divisore, cioè if(N % num == 0)
    • in caso affermativo aumenti il contatore
    Sicuramente sono possibili ottimizzazioni, ma intanto può essere un punto di partenza.
  • Re: DIVISORI DI UN NUMERO IN C

    Quella era la mia prima idea, ma é da scartare perché se tu inserisci un numero superiore al miliardo il compilatore fatica a fare l'operazione in un tempo utile
  • Re: DIVISORI DI UN NUMERO IN C

    Un possibile miglioramento è il seguente: puoi fermarti alla radice quadrata di N. Infatti, quando trovi un divisore, ne trovi in realtà due: per avere l'altro ti basta fare la divisione vera e propria. Prendiamo come esempio 14, e diciamo che la sua radice quadrata è 4 (arrotondamento per eccesso). Allora partiamo:
    • 1 è un divisore, e questo ti dà anche il divisore 14/1=14
    • 2 è un divisore, e questo ti dà anche 14/2=7
    • 3 non è un divisore, quindi niente
    • 4 non è un divisore
    Stop: abbiamo raggiunto la radice quadrata e ci fermiamo. In conclusione i divisori sono 1, 2, 7 e 14.

    Sperando di non aver detto stupidaggini, questo metodo ti aiuta a ridurre un po' i calcoli. In ogni caso tieni presente che fattorizzare un numero non è in generale un'operazione complessa, ammesso ovviamente di non pescare alcuni numeri particolari (cfr. algoritmo di crittografia RSA). Un'idea molto parziale è la seguente. Provi a dividere il numero per 2: se è un divisore, continui a dividere per 2 finché è possibile, aumentando un contatore che rappresenterà poi l'esponente. Quindi passi a 3, quindi a 4 (questo si può saltare perché già "compreso" nel 2 che hai provato prima), quindi 5, ecc. Esempio pratico: prendiamo il numero 36.
    36 è divisibile per 2: aumento di uno il contatore associato al fattore 2
    18 è divisibile per 2: aumento di uno il contatore associato al fattore 2
    9 non è divisibile per 2, quindi con il 2 ho finito. Il contatore vale 2, quindi ottengo 2^2 e passo al 3
    9 è divisibile per 3: aumento di uno il contatore associato a 3
    3 è divisibile per 3: aumento di uno il contatore associato a 3
    1 è la condizione di terminazione.
    In conclusione ottieni 2^2 * 3^2, che è la scomposizione desiderata.
  • Re: DIVISORI DI UN NUMERO IN C

    Grazie veramente tantissimo, è proprio quello che mi interessava, veramente gentilissimo
  • Re: DIVISORI DI UN NUMERO IN C

    alele ha scritto:


    grazie veramente tantissimo, è proprio quello che mi interessava, veramente gentilissimo
    Di nulla. Se hai altri problemi, siamo qui.
  • Re: DIVISORI DI UN NUMERO IN C

    @minomic: ragiona! Dopo il 2, puoi scartare TUTTI i numeri pari!
  • Re: DIVISORI DI UN NUMERO IN C

    migliorabile ha scritto:


    @minomic: ragiona! Dopo il 2, puoi scartare TUTTI i numeri pari!
    Cosa ti è sfuggito in questa parte del mio post precedente?
    quindi a 4 (questo si può saltare perché già "compreso" nel 2 che hai provato prima)
Devi accedere o registrarti per scrivere nel forum
7 risposte