Numeri felici

« Older   Newer »
 
  Share  
.
  1. Pippo_94
     
    .

    User deleted


    Per la gioia di nessuno tutti posto un nuovo esercizio sulla programmazione. Premetto che richiede anche l'uso di un po' di testa (io non sono riuscito a trovare una valida soluzione per ora :asd:)...

    CITAZIONE
    Prendiamo in considerazione questo esempio:

    72 = 49
    42 + 92 = 97
    92 + 72 = 130
    12 + 32 + 02 = 10
    12 + 02 = 1

    7 Può essere definito come numero felice in quanto, utilizzando una sequenza ripetitiva, la somma dei quadrati delle sue cifre porta a 1.

    Per informazioni maggiori, vi invito a visitare la pagina su Wikipedia.




    L'esercizio che volevo proporvi è il seguente:

    Sviluppare una funzione (o un programma, a seconda delle proprie preferenze) che soddisfi almeno uno di questi requisiti:

    • Dato un numero intero in input, verificare la presenza di numeri felici nell'intervallo da 0 a n.

    • Dato un numero intero in input, verificare che esso sia felice o meno.

     
    Top
    .
  2. x-reynik-x
     
    .

    User deleted


    Cavolo, io non ci riesco!!
    Con Python non so come fargli prendere in considerazione le singole cifre dei numeri che gli dai

    ah si forse ho trovato!
    se dai un numero e poi metti len(str(n)) di dice quanto è lungo perchè lo trasforma in stringa! ci penso un po' e poi forse domani posto la soluzione
    bye bye devo andare a far latino adesso :wacko:
     
    Top
    .
  3.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Questa sera non lo so, ma domani probabilmente lo faccio.

    CITAZIONE (x-reynik-x @ 5/11/2009, 17:34)
    Cavolo, io non ci riesco!!
    Con Python non so come fargli prendere in considerazione le singole cifre dei numeri che gli dai

    ah si forse ho trovato!
    se dai un numero e poi metti len(str(n)) di dice quanto è lungo perchè lo trasforma in stringa! ci penso un po' e poi forse domani posto la soluzione
    bye bye devo andare a far latino adesso :wacko:

    Se intendi da stringa ti basta considerare un carattere. Altrimenti:
    Supponiamo di avere 35, per prendere entrambe le cifre puoi fare:

    35%10 = 5
    35/10 = 3

    ;)
     
    Top
    .
  4. lumo
     
    .

    User deleted


    sembra facile ma... asd
     
    Top
    .
  5. 6enK$_5Ch
     
    .

    User deleted


    Appena ho tempo ci provo... sembra abbastanza semplice come esercizio.
     
    Top
    .
  6. GnuPaolo
     
    .

    User deleted


    CITAZIONE (lumo @ 5/11/2009, 18:49)
    sembra facile ma... asd

    Be', facendo una ricorsiva non è così difficile, itoa(), estrai le cifre, atoi(), e ricorsione, solo che bisogna implementare un qualcosa che eviti i loop, tipo un counter che per ogni ricorsione aumenta, e se raggiunge 32767 [uhm, è da vedere quanti capiranno il perchè di questo numero] o un qualche altro numero a scelta si lancia un break; o un continue; e si passa al numero successivo.
     
    Top
    .
  7. Ace.
     
    .

    User deleted


    Ecco il mio in Pascal:
    CODICE
    program numeri_felici;
    uses crt;
    var x,y,num,somma:integer;
       ris:boolean;
    begin
        readln(x);
        num:=x;
        somma:=0;
        ris:=false;
        while (x>1) and not(ris) do
        begin
             while num>0 do
             begin
                  y:=num mod 10;
                  somma:=somma+sqr(y);
                  num:=num div 10;
             end;
             if somma=1 then
                ris:=true;
             num:=somma;
             somma:=0;
             if num=4 then
                ris:=true;
        end;
        if num=1 then
           writeln(x,' è un numero felice')
        else
           writeln(x,' non è un numero felice');
        readln
    end.


    L'ho compilato con dev-pascal e il resoconto è questo: se il numero è felice scrive che lo è... però se non lo è non scrive niente XD quindi in qualche modo è giusto.

    EDIT: ho modificato il secondo "if" dentro il ciclo e ora va. In pratica mi pare di aver capito (leggendo da Wikipedia) che quando un numero non è felice durante la sequenza diventa sempre,ad un certo punto, 4, ma non sono sicuro, correggetemi se sbaglio.

    Edited by Ace. - 5/11/2009, 21:40
     
    Top
    .
  8.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    CITAZIONE (GnuPaolo @ 5/11/2009, 20:27)
    CITAZIONE (lumo @ 5/11/2009, 18:49)
    sembra facile ma... asd

    Be', facendo una ricorsiva non è così difficile, itoa(), estrai le cifre, atoi(), e ricorsione, solo che bisogna implementare un qualcosa che eviti i loop, tipo un counter che per ogni ricorsione aumenta, e se raggiunge 32767 [uhm, è da vedere quanti capiranno il perchè di questo numero] o un qualche altro numero a scelta si lancia un break; o un continue; e si passa al numero successivo.

    è un numero che occupa 15bit 111111111111111, e che è l'intero positivo più grande rappresentabile in 16 bit.. mmm.
     
    Top
    .
  9. ~Andrey™
     
    .

    User deleted


    CITAZIONE (RootkitNeo @ 5/11/2009, 21:36)
    CITAZIONE (GnuPaolo @ 5/11/2009, 20:27)
    Be', facendo una ricorsiva non è così difficile, itoa(), estrai le cifre, atoi(), e ricorsione, solo che bisogna implementare un qualcosa che eviti i loop, tipo un counter che per ogni ricorsione aumenta, e se raggiunge 32767 [uhm, è da vedere quanti capiranno il perchè di questo numero] o un qualche altro numero a scelta si lancia un break; o un continue; e si passa al numero successivo.

    è un numero che occupa 15bit 111111111111111, e che è l'intero positivo più grande rappresentabile in 16 bit.. mmm.

    Perchè 15? Ne occupa 16 xD

    Comunque non sembra proprio complicato, basta ragionarci un po'.

    Edited by ~Andrey™ - 5/11/2009, 22:31
     
    Top
    .
  10. 6enK$_5Ch
     
    .

    User deleted


    Ecco il mio come sempre in C, ho messo una limitazione di 100 cicli sull'assegnazione del valore di ritorno della funzione ricorsiva foo() alla variabile num. Se no poteva durare all'infinito :D
    CODICE
    #include <stdio.h>

    int foo(int numx)
    {
           if(numx==0)
                   return 0;
           else
                   return (numx%10)*(numx%10) + foo(numx/10);
    }

    int main()
    {
           int num, i=1;
           printf("Inserisci un numero: ");
           scanf("%d", &num);
           printf("Ora si verificherà se in 100 cicli il numero risulterà felice...\n");

           while(i++<100 && num!=1)
                   num = foo(num);
           if(num==1)
                   printf("Il numero e' felice!\n");
           else
                   printf("Il numero non e' felice!\n");
           return 0;
    }
     
    Top
    .
  11. Ace.
     
    .

    User deleted


    CITAZIONE (~Andrey™ @ 5/11/2009, 22:30)
    CITAZIONE (RootkitNeo @ 5/11/2009, 21:36)
    è un numero che occupa 15bit 111111111111111, e che è l'intero positivo più grande rappresentabile in 16 bit.. mmm.

    Perchè 15? Ne occupa 16 xD

    Comunque non sembra proprio complicato, basta ragionarci un po'.

    Mi pare che il primo bit è per il segno ma comunque hai ragione, ne occupa 16.
     
    Top
    .
  12. ~Andrey™
     
    .

    User deleted


    CITAZIONE (Ace. @ 5/11/2009, 22:32)
    CITAZIONE (~Andrey™ @ 5/11/2009, 22:30)
    Perchè 15? Ne occupa 16 xD

    Comunque non sembra proprio complicato, basta ragionarci un po'.

    Mi pare che il primo bit è per il segno ma comunque hai ragione, ne occupa 16.

    Dipende, se è Unsigned no :P [In questo caso il valore massimo è il doppio, cioè 65536]
     
    Top
    .
  13. ~{Skydrake™}»
     
    .

    User deleted


    CITAZIONE (~Andrey™ @ 5/11/2009, 22:37)
    Dipende, se è Unsigned no :P [In questo caso il valore massimo è il doppio, cioè 65536]

    Eh, già. Magari vuoi lavorare solo con i valori assoluti...che te ne fai del Signed?
     
    Top
    .
  14.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Si, io ho considerato solo i bit significativi, contando il bit più significativo su 0, e non su uno (proprio per il fatto del segno).

    Più tardi forse proverò a svolgere l'esercizio.
     
    Top
    .
  15. x-reynik-x
     
    .

    User deleted


    CITAZIONE (Ace. @ 5/11/2009, 21:09)
    Ecco il mio in Pascal:
    CODICE
    program numeri_felici;
    uses crt;
    var x,y,num,somma:integer;
       ris:boolean;
    begin
        readln(x);
        num:=x;
        somma:=0;
        ris:=false;
        while (x>1) and not(ris) do
        begin
             while num>0 do
             begin
                  y:=num mod 10;
                  somma:=somma+sqr(y);
                  num:=num div 10;
             end;
             if somma=1 then
                ris:=true;
             num:=somma;
             somma:=0;
             if num=4 then
                ris:=true;
        end;
        if num=1 then
           writeln(x,' è un numero felice')
        else
           writeln(x,' non è un numero felice');
        readln
    end.


    L'ho compilato con dev-pascal e il resoconto è questo: se il numero è felice scrive che lo è... però se non lo è non scrive niente XD quindi in qualche modo è giusto.

    EDIT: ho modificato il secondo "if" dentro il ciclo e ora va. In pratica mi pare di aver capito (leggendo da Wikipedia) che quando un numero non è felice durante la sequenza diventa sempre,ad un certo punto, 4, ma non sono sicuro, correggetemi se sbaglio.

    Come funziona?
     
    Top
    .
32 replies since 5/11/2009, 17:09   709 views
  Share  
.