Punto informatico Network
Login Esegui login | Non sei registrato? Iscriviti ora (è gratuito!)
Username: Password:
  • Annuncio Pubblicitario

[Ansi C] Trovare i divisori di un numero

Il forum per tutti i developer. Leggere attentamente il regolamento di sezione prima di postare.

[Ansi C] Trovare i divisori di un numero

Messaggioda Monkey13 » gio dic 28, 2006 10:10 am

Salve a tutti!
Essendo al terzo anno di un istituto tecnico per periti informatici, mi stavo allenando nell'uso dei cicli. Il testo richiede:

Dato un numero stampare a video tutti i suoi divisori.

Una soluzione l'ho già fatta e funzionante:

Codice: Seleziona tutto
#include <stdio.h> /*Consente l'uso di printf e scanf*/
#include <conio.h> /*Consente l'uso di getch*/

void tasto (void){
    getch();
}/*Funzione tasto*/

void nl (void){
     printf("\n");
}/*nl*/

void autore (void){
     int i;
     for (i=0;i<40;i++)
         printf(" ");
     printf("||:-->By Monkey<<--:||");
}/*autore*/

int leggi (const char*st){
    int n;
    printf("%s", st);
    scanf ("%d", &n);
    return n;
} /*Funzione leggi*/

/*
  IP: n numero NUM_N+
  OV: Tutti i divisori di n
*/

void Divisori_n (int n){
    int p;
    p=0;
        while (p<=n/2){
        p++;
             while (n%p==0)
             printf("%d ",p++);
        }/*while*/
}/*Divisori_n*/

int main (void){
    int n;
    nl();
    printf("Il programma mostrera' i divisori di un numero scelto\n");
    nl();
    n=leggi("Inserire il numero da analizzare : ");
    nl();
    printf("I divisori sono : \n");
    nl();
    Divisori_n(n);
    nl();
    autore();
    tasto();
}/*main*/


Come potete notare ho usato i cicli annidati, ma preferirei non usarli. Ho tentato di esprimere la formula con una condizioni booleana con AND (&&), ma non mi da il risultato che voglio. Come posso migliorare la funzione "Divisori_n"? Grazie ciao! [rolleyes]
"La civiltà ebbe inizio quando per la prima volta l'uomo scavò la terra e vi gettò un seme." Kahlil Gibran
Avatar utente
Monkey13
Bronze Member
Bronze Member
 
Messaggi: 545
Iscritto il: gio giu 23, 2005 8:35 pm
Località: Padova (Vigodarzere)

Messaggioda Ices_Eyes » gio dic 28, 2006 11:03 am

Ora è presto e mi sono appena svegliato, ma se fai una cosa tipo:

Codice: Seleziona tutto
void Divisori_n (int n){
    int p;
    p=1;
    while (p<=n/2){
        if(n % p == 0) printf("%d", p++);
    }/*while*/
    printf("%d", n);
}/*Divisori_n*/

non funziona? [uhm]
Avatar utente
Ices_Eyes
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5543
Iscritto il: ven ott 24, 2003 10:37 am
Località: Prov. di Venezia

Messaggioda Monkey13 » gio dic 28, 2006 11:12 am

Ices_Eyes ha scritto:Ora è presto e mi sono appena svegliato, ma se fai una cosa tipo:

Codice: Seleziona tutto
void Divisori_n (int n){
    int p;
    p=1;
    while (p<=n/2){
        if(n % p == 0) printf("%d", p++);
    }/*while*/
    printf("%d", n);
}/*Divisori_n*/

non funziona? [uhm]


No perché facendo anche le classi di test risulta:

I:={36} O:={1,2,3,4}

I:={54} O:={1,2,3}
L'algoritmo non funziona.
Grazie comunque.. [std]
"La civiltà ebbe inizio quando per la prima volta l'uomo scavò la terra e vi gettò un seme." Kahlil Gibran
Avatar utente
Monkey13
Bronze Member
Bronze Member
 
Messaggi: 545
Iscritto il: gio giu 23, 2005 8:35 pm
Località: Padova (Vigodarzere)


Messaggioda Ices_Eyes » gio dic 28, 2006 11:46 am

AAAAahhhhhhnn...ora ho capito!!! Vuoi fare la scomposizione in fattori primi allora!!! [uhm]
Avatar utente
Ices_Eyes
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5543
Iscritto il: ven ott 24, 2003 10:37 am
Località: Prov. di Venezia

Messaggioda Monkey13 » gio dic 28, 2006 12:10 pm

Ices_Eyes ha scritto:AAAAahhhhhhnn...ora ho capito!!! Vuoi fare la scomposizione in fattori primi allora!!! [uhm]


No.. allora il tuo algoritmo presente i risultati che ti ho fatto vedere...
Io voglio che dato un numero, mi mostri tutti i suoi divisori per cui:

Continuo a ad aumentare p AND a stamparlo quando n%p ==0 (è divisore) e FINCHE' p non arriva alla metà di n (perché la metà di un numero è l'ultimo suo divisore. Un po' più chiaro adesso?... Classe di test :

I:={36} O:={1,2,3,4,6,9,12,18}

I:={54} O:={1,2,3,6,9,18,27}
"La civiltà ebbe inizio quando per la prima volta l'uomo scavò la terra e vi gettò un seme." Kahlil Gibran
Avatar utente
Monkey13
Bronze Member
Bronze Member
 
Messaggi: 545
Iscritto il: gio giu 23, 2005 8:35 pm
Località: Padova (Vigodarzere)

Messaggioda Ices_Eyes » gio dic 28, 2006 1:25 pm

Si, hai ragione, sono scemo io, cioè, avevo detto che avevo sonno [:)]

Codice: Seleziona tutto
void Divisori_n (int n) {
    int p;
    p=1;
    while (p<=n/2){
        if(n % p == 0) printf("%d", p);
        p++;
    }/*while*/
    printf("%d", n);
}/*Divisori_n*/
Avatar utente
Ices_Eyes
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5543
Iscritto il: ven ott 24, 2003 10:37 am
Località: Prov. di Venezia

Messaggioda Monkey13 » gio dic 28, 2006 2:56 pm

grazie! [^]
"La civiltà ebbe inizio quando per la prima volta l'uomo scavò la terra e vi gettò un seme." Kahlil Gibran
Avatar utente
Monkey13
Bronze Member
Bronze Member
 
Messaggi: 545
Iscritto il: gio giu 23, 2005 8:35 pm
Località: Padova (Vigodarzere)

Messaggioda M@ttia » dom dic 31, 2006 1:05 am

Ad essere pignoli puoi spingerti anche solo fino alla radice quadrata del numero (arrotondata verso l'alto) anziché n/2, su numeri grandi risparmi molti controlli (e per ogni "x" trovato fin lì gli fai stampare x e n/x...). [;)]
</IE><FIREFOX>
Avatar utente
M@ttia
Moderatore
Moderatore
 
Messaggi: 8363
Iscritto il: lun giu 09, 2003 2:18 pm
Località: Ticino - Estero

Messaggioda Monkey13 » dom dic 31, 2006 10:16 am

M@ttia ha scritto:Ad essere pignoli puoi spingerti anche solo fino alla radice quadrata del numero (arrotondata verso l'alto) anziché n/2, su numeri grandi risparmi molti controlli (e per ogni "x" trovato fin lì gli fai stampare x e n/x...). [;)]


ah tipo il giochetto del logaritmo...
Avatar utente
Monkey13
Bronze Member
Bronze Member
 
Messaggi: 545
Iscritto il: gio giu 23, 2005 8:35 pm
Località: Padova (Vigodarzere)

Messaggioda M@ttia » dom dic 31, 2006 12:06 pm

Monkey13 ha scritto:
M@ttia ha scritto:Ad essere pignoli puoi spingerti anche solo fino alla radice quadrata del numero (arrotondata verso l'alto) anziché n/2, su numeri grandi risparmi molti controlli (e per ogni "x" trovato fin lì gli fai stampare x e n/x...). [;)]


ah tipo il giochetto del logaritmo...
???

Non so che giochetti fate tu e i logaritmi [:D]
</IE><FIREFOX>
Avatar utente
M@ttia
Moderatore
Moderatore
 
Messaggi: 8363
Iscritto il: lun giu 09, 2003 2:18 pm
Località: Ticino - Estero


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti

Powered by phpBB © 2002, 2005, 2007, 2008 phpBB Group
Traduzione Italiana phpBB.it

megalab.it: testata telematica quotidiana registrata al Tribunale di Cosenza n. 22/09 del 13.08.2009, editore Master New Media S.r.l.; © Copyright 2008 Master New Media S.r.l. a socio unico - P.I. 02947530784. GRUPPO EDIZIONI MASTER Spa Tutti i diritti sono riservati. Per la pubblicità: Master Advertising