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
mi vuole aiutare!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!