Problema del 3n+1
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
.
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

Risposte
Ricordandomi quel poco di C che ho fatto
a Matematica, ho scritto questo... Vedi se funziona:
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; }
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
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
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
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
grazie lorven...ma fino a questa pseudocodifica ero giunto anch'io....non so scrivere esattamente....

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

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....
cmq grazie lo stesso!vediamo se qualche altra buon'anima
mi vuole aiutare!
o cmq se conosci qualche altro linguaggio puoi scriverlo pure....

cmq grazie lo stesso!vediamo se qualche altra buon'anima

o cmq se conosci qualche altro linguaggio puoi scriverlo pure....

"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....![]()
cmq grazie lo stesso!vediamo se qualche altra buon'animami vuole aiutare!
o cmq se conosci qualche altro linguaggio puoi scriverlo pure....
Se vuoi ti scrivo un programmino e te lo mando, così non ti complichi la vita.
Ciao!

si!grazie mille!!!!!




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.

"blackdie":
si!grazie mille!!!!!![]()
![]()
![]()
Te l'ho inviato, prova a vedere se funziona
Ciao!

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....
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....
C'è anche il tipo LONGINT, per interi maggiori
Min longint value = -2147483648
Max longint value = 2147483647
Min longint value = -2147483648
Max longint value = 2147483647
ah cavolo è vero....me ne ero dimenticato...
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...

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...
Per valori superiori bisogna ricorrere ai tipi REAL o simili, almeno nei linguaggi che conosco (pochi).
si ma a quel punto mod e div non funzionano piu!

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.
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.
while(n != 1) { if (n % 2 == 0) n = n / 2; else n = n * 3 + 1; printf("%d\n",n); getch(); };
Credo basti questo
"blackdie":
si!grazie mille!!!!!![]()
![]()
![]()
Blackdie, ma funziona almeno il programma che ti ho inviato?
Ciao!

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!
"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!
