Problema del 3n+1

blackdie
Scusate per la banalità ma come faccio a scrivere in linguaggio c++ il seguente algoritmo,detto di collatz:


Si prenda un intero positivo n.
Se n è pari, si divida per due; se è dispari, si moltiplichi per 3 e si aggiunga 1.
Se n = 1, l'algoritmo termina; altrimenti si ripete dal secondo passo.


Mi potete fornire il codice?


Grazie :-D .

Risposte
fireball1
Ricordandomi quel poco di C che ho fatto
a Matematica, ho scritto questo... Vedi se funziona:

#include <stdio.h>
#include <stdlib.h>
 main()
{
 int k,n;
 printf("\n\n Inserire il numero: ");scanf("%d",&k);
 n=k/2;
 if(k==n*2) printf("\n\n Il numero inserito e' pari e diviso per 2 da': %d\n\n",k/2);
 else printf("\n\n Il numero inserito e' dispari e 3n+1=%d\n\n",3*n+1);
 else if(k==1) return 0;
 system ("PAUSE");
 return 0;
}

blackdie
uhm....non funziona:chiedo scusa ma io di c++ non so praticamente nulla e non so dove correggere....
cmq il programma nell'eseguire visualizza tutti i passaggi e scrive quanti ne ha compiuti?
perchè mi sevirebbere anche quelli....


grazie ancora x ki sara disponibile ad aiutarmi

lorven
Codificati in C questa pseudocodifica (il C non me lo ricordo più ormai...)

INIZIO

Leggi n
cont=0
Ripeti
Se Mod(n,2)=0
Allora n=n/2
Altrimenti n=n*3+1
Fine Se
cont=cont+1
Stampa n
Finchè n=1
Stampa cont

FINE

n è il nostro numero
cont conta quanti passaggi sono stati eseguiti
mod è la funzione modulo - calcola il resto della divisione

blackdie
grazie lorven...ma fino a questa pseudocodifica ero giunto anch'io....non so scrivere esattamente.... :-D

lorven
E' grave se devi scrivere un programmino ma non conosci NULLA del linguaggio! :shock:

blackdie
infatti...mi piacerebbe studiarlo ma in questo periodo tra scuola e impegni vari non ho tempo...penso che mi mettero quest'estate...ma nel frattempo volevo questo programmino...e vi ho chiesto aiuto.... :oops:

cmq grazie lo stesso!vediamo se qualche altra buon'anima :smt059 mi vuole aiutare!
o cmq se conosci qualche altro linguaggio puoi scriverlo pure.... :D

carlo232
"blackdie":
infatti...mi piacerebbe studiarlo ma in questo periodo tra scuola e impegni vari non ho tempo...penso che mi mettero quest'estate...ma nel frattempo volevo questo programmino...e vi ho chiesto aiuto.... :oops:

cmq grazie lo stesso!vediamo se qualche altra buon'anima :smt059 mi vuole aiutare!
o cmq se conosci qualche altro linguaggio puoi scriverlo pure.... :D


Se vuoi ti scrivo un programmino e te lo mando, così non ti complichi la vita.

Ciao! :D

blackdie
si!grazie mille!!!!! :D :prayer: :smt041 :smt023

lorven
Prova questo (è PASCAL)
program pippo;
uses wincrt;
var n,cont:integer;
begin
write('dammi un numero: ');
readln(n);
cont:=0;
repeat
    if n mod 2 = 0
       then n:=n div 2
       else n:=n*3+1;
    cont:=cont+1;
    writeln(n);
until n=1;
write('n. passaggi: ',cont);
readln
end. 

:D

carlo232
"blackdie":
si!grazie mille!!!!! :D :prayer: :smt041 :smt023


Te l'ho inviato, prova a vedere se funziona

Ciao! :D

blackdie
grazie !
il pascal lo conosco pure io... ma penso che il limite del pascal stia nel fatto che si possano inserire numeri interi sino a 65536....

lorven
C'è anche il tipo LONGINT, per interi maggiori
Min longint value = -2147483648
Max longint value = 2147483647

blackdie
ah cavolo è vero....me ne ero dimenticato... :smt021
e tu sai per caso negli altri programmi fino a dove arrivano?c++ mi sembra anche quello fino a quel valore..ma mi sembra poco...

lorven
Per valori superiori bisogna ricorrere ai tipi REAL o simili, almeno nei linguaggi che conosco (pochi).

blackdie
si ma a quel punto mod e div non funzionano piu! :-)

lorven
Usa divisione e moltiplicazione anzichè mod e / invece di div per tipi REAL, DOUBLE o EXTENDED.
A questo punto però non si dovrebbe usare più l'uguaglianza con zero, ma controllare che il resto sia prossimo alla zero, permanendo problemi di approssimazione nella divisione.

luciano791

    while(n != 1)
    {
        if (n % 2 == 0)
            n = n / 2;
        else
            n = n * 3 + 1;
        printf("%d\n",n);
        getch();
    };


Credo basti questo

carlo232
"blackdie":
si!grazie mille!!!!! :D :prayer: :smt041 :smt023


Blackdie, ma funziona almeno il programma che ti ho inviato?

Ciao! :D

blackdie
no...perche il webserver tenta di leggere i lfile txt senza permettermi di salvare...devi spedirmelo con un altra estensione...o dentro ad u nfile zip!

carlo232
"blackdie":
no...perche il webserver tenta di leggere i lfile txt senza permettermi di salvare...devi spedirmelo con un altra estensione...o dentro ad u nfile zip!


Ho fatto

Ciao! :D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.