[Risolto]Numero Triangolare in Java

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
Saruman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2378
Iscrizione: venerdì 16 marzo 2007, 22:29

[Risolto]Numero Triangolare in Java

Messaggio da Saruman »

Ciao ragazzi,

Sto uscendo pazzo, non riesco a capire perché questa classe, che restituisce true solo se il numero passato è un numero triangolare http://it.wikipedia.org/wiki/Numero_triangolare;

La mia classe funziona per tutti i numeri tranne che per il tre...

ma non capisco perchè.

Codice: Seleziona tutto

package testVari;

public class NumeroTriangolare {
	private int numeroTriangolare;
	
	NumeroTriangolare(int t){
		numeroTriangolare=t;
		
	}
	
	public boolean verificaNumeroTriangolare() {
		//if (numeroTriangolare<= 3)throw new RuntimeException("Il numero deve essere maggiore di tre");
		boolean a= true;
		int s=0;
		int risultato=1;
		for(int k=1; k!=numeroTriangolare; k++){
			if (risultato==numeroTriangolare){
				a= true;
			}
			else{
				s=k;
				s++;
				risultato=(k*s)/2;
				a= false;
			}
		}
		
		return a;
		
	}

}

Codice: Seleziona tutto

public class StartTest {

	
	public static void main(String[] args) throws InterruptedException {
		
		
		NumeroTriangolare a = new NumeroTriangolare(6);
		System.out.println(a.verificaNumeroTriangolare());
		
		
		
		
		
		
	}

}
Ultima modifica di Saruman il mercoledì 18 febbraio 2009, 16:27, modificato 1 volta in totale.
Dahman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1013
Iscrizione: mercoledì 31 ottobre 2007, 8:29
Località: Torino

Re: Numero Triangolare in Java

Messaggio da Dahman »

basta che metti

Codice: Seleziona tutto

for(int k=1; k<=numeroTriangolare; k++){
ciao
dahman

edit: comunque il tuo algoritmo non fa quello che pensi che faccia... :(
Ultima modifica di Dahman il mercoledì 18 febbraio 2009, 13:58, modificato 1 volta in totale.
Avatar utente
utey
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 435
Iscrizione: martedì 22 agosto 2006, 14:32
Località: Pavia

Re: Numero Triangolare in Java

Messaggio da utey »

Mi hanno anticipato.
Tra le altre cose ti trovi a fare 2 volte il confronto con risultato=1. Potresti iniziare da k=2 e risparmi un ciclo.
C'è anche da notare che per numeri triangolari abbastanza alti fai un numero spropositato di confronti...
Avatar utente
Saruman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2378
Iscrizione: venerdì 16 marzo 2007, 22:29

Re: Numero Triangolare in Java

Messaggio da Saruman »

in che senso non fa quello che penso?
Dahman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1013
Iscrizione: mercoledì 31 ottobre 2007, 8:29
Località: Torino

Re: Numero Triangolare in Java

Messaggio da Dahman »

in che senso non fa quello che penso?
Intendo dire che non controlla realmente se un numero é triangolare o meno ma ogni volta comincia a calcolare tutti i numeri triangolari, partendo dal primo, finché non incontra quello che stai cercando (se lo incontra).
Sarebbe molto più semplice e veloce verificare direttamente se quel numero é triangolare o meno con l'espressione indicata nel sito che hai già citato.

ciao
dahman
Avatar utente
utey
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 435
Iscrizione: martedì 22 agosto 2006, 14:32
Località: Pavia

Re: Numero Triangolare in Java

Messaggio da utey »

Al primo ciclo
k=1
s=2 --> risultato=(2*1)/2 =1;
Al secono ciclo il confronto tra risultato e numeroTriangolare avviene come al primo ciclo.
Tanto vale partire con k=2;
Il fatto del 3 è che tu il confronto con risultato=3 non lo farai mai perché appena arrivi ad avere k=3 il for esce e non esegue il ciclo con risultato=3
Io farei il controllo così:

Codice: Seleziona tutto

	public boolean verificaNumeroTriangolare() {
		//if (numeroTriangolare<= 3)throw new RuntimeException("Il numero deve essere maggiore di tre");
		boolean a= false;
		int s=numeroTriangolare*2;
		for(int k=2; (k*(k+1))/2<=numeroTriangolare; k++){
			if ((s/k)==(k+1))
				a= true;
                                break;
			else
				a= false;
		}
		return a;
		
	}
L'ho messo giù un po' di fretta e non l'ho provato.
L'idea è quella di trovare un numero che soddisfi l'equazione (n*(n+1))/2=numeroTriangolare
Avatar utente
Saruman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2378
Iscrizione: venerdì 16 marzo 2007, 22:29

Re: Numero Triangolare in Java

Messaggio da Saruman »

In java come faccio a far eseguire la radice? spqr non rocordo
Dahman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1013
Iscrizione: mercoledì 31 ottobre 2007, 8:29
Località: Torino

Re: Numero Triangolare in Java

Messaggio da Dahman »

Io lo farei cosi

Codice: Seleziona tutto

	    
           float m;
	    m=(sqrt(8*numeroTriangolare+1)-1)/2;
	    if (m == int(m))
                return true;
            else
		return false;
Non so il codice é corretto come sintassi (non conosco JAVA) ma l'idea credo sia chiara

ciao
dahman
Avatar utente
Saruman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2378
Iscrizione: venerdì 16 marzo 2007, 22:29

Re: Numero Triangolare in Java

Messaggio da Saruman »

Mi hai anticipato,

Codice: Seleziona tutto

public boolean verificaNumeroTriangolare(){
		long m;
		m=((Math.sqrt(8*numeroTriangolare)+1)-1)/2;
		
	}
Peccato che mi dia errore
Avatar utente
Saruman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2378
Iscrizione: venerdì 16 marzo 2007, 22:29

Re: Numero Triangolare in Java

Messaggio da Saruman »

Anche il confronto intero mi da errore...

Io sono alle prime armi in java uff

Codice: Seleziona tutto

public boolean verificaNumeroTriangolare(){
		 float m;
		    m=(Math.sqrt(8*numeroTriangolare+1)-1)/2;
		    if (m == int(m))
	                return true;
	            else
			return false;
		
	}
	
Dahman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1013
Iscrizione: mercoledì 31 ottobre 2007, 8:29
Località: Torino

Re: Numero Triangolare in Java

Messaggio da Dahman »

Mi hai anticipato,

Codice:

public boolean verificaNumeroTriangolare(){
long m;
m=((Math.sqrt(8*numeroTriangolare)+1)-1)/2;

}


Peccato che mi dia errore
forse é solo un problema di parentesi e al posto di long metti double
prova cosi

Codice: Seleziona tutto


public boolean verificaNumeroTriangolare(){
		double m;
		m=(Math.sqrt(8*numeroTriangolare+1)-1)/2;
		
	}
ciao
dahman
Avatar utente
Saruman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2378
Iscrizione: venerdì 16 marzo 2007, 22:29

Re: Numero Triangolare in Java

Messaggio da Saruman »

ok!

Ora come faccio a fare il confronto tra interi!

Codice: Seleziona tutto

if (m == int(m))
            return true;
        else
	return false;
Avatar utente
Saruman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2378
Iscrizione: venerdì 16 marzo 2007, 22:29

Re: Numero Triangolare in Java

Messaggio da Saruman »

Ecco il codice corretto e funzionante, almeno per i 55 primi interi.

Codice: Seleziona tutto


public class NumeroTriangolare {
	private int numeroTriangolare;
	
	NumeroTriangolare(int t){
		numeroTriangolare=t;
		
	}
	
	public boolean cercaNumeroTriangolare() {
		//if (numeroTriangolare<= 3)throw new RuntimeException("Il numero deve essere maggiore di tre");
		boolean a= true;
		int s=0;
		int risultato=1;
		for(int k=1; k<=numeroTriangolare; k++){
			if (risultato==numeroTriangolare){
				a= true;
			}
			else{
				s=k;
				s++;
				risultato=(k*s)/2;
				a= false;
				if(risultato==numeroTriangolare)
					System.err.println("( "+k+"*"+s+" ) Diviso 2 = "+risultato+" Quindi "+numeroTriangolare+" è un Numero Triangolare");
			}
		}
		
		return a;
		
	}

	public boolean verificaNumeroTriangolare(){
		double m;
		m=(Math.sqrt(8*numeroTriangolare+1)-1)/2;
		
		if (m == (int)m)
            return true;
        else
	return false;
		
	}

}
Il Main

Codice: Seleziona tutto

public class StartTest {

	
	public static void main(String[] args) throws InterruptedException {
		
		
		NumeroTriangolare a = new NumeroTriangolare(55);
		System.out.println(a.cercaNumeroTriangolare());
		System.out.println(a.verificaNumeroTriangolare());
		
		
		
		
		
		
	}

}
Dahman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1013
Iscrizione: mercoledì 31 ottobre 2007, 8:29
Località: Torino

Re: [Risolto]Numero Triangolare in Java

Messaggio da Dahman »

Forse non ho capito bene cosa intendi fare e ottenere ma mi sembra un pò troppo complicato.
Ma tu vuoi sapere quali sono i primi 55 numeri triangolari oppure quali tra i primi 55 numeri interi quelli triangolari?.

In tutti e due i casi, puoi semplificare il tuo programma, secondo me. :)

ciao
dahman
Avatar utente
Saruman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2378
Iscrizione: venerdì 16 marzo 2007, 22:29

Re: [Risolto]Numero Triangolare in Java

Messaggio da Saruman »

io vorrei semplicemente passare un numero al costruttore e vorrei che mi restituisca vero se il numero è un numero triangolare false altrimenti. Io più semplice di cosi non lo so fare. pero accetto volentieri consigli.

Il primo metodo è particolarmente interessante perché posso programmarci una macchina di Thuring
utilizzando JFLAP
http://www.jflap.org/jflaptmp/
http://www.jflap.org/

Praticamente l'ultima versione della prova pratica di Informatica Teorica.
Dahman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1013
Iscrizione: mercoledì 31 ottobre 2007, 8:29
Località: Torino

Re: [Risolto]Numero Triangolare in Java

Messaggio da Dahman »

o vorrei semplicemente passare un numero al costruttore e vorrei che mi restituisca vero se il numero è un numero triangolare false altrimenti. Io più semplice di cosi non lo so fare. pero accetto volentieri consigli.
Se é cosi, a che ti serve la funzione cercaNumeroTriangolare(), ti basta la verificaNumeroTriangolare().

ciao
dahman
Avatar utente
Saruman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2378
Iscrizione: venerdì 16 marzo 2007, 22:29

Re: [Risolto]Numero Triangolare in Java

Messaggio da Saruman »

Hai ragione! ma con cerca usando (k * k+1)/2 == al numero passato è più facile programmare una macchina di turing
NGA1997
Prode Principiante
Messaggi: 1
Iscrizione: domenica 12 febbraio 2017, 12:17
Distribuzione: linux
Sesso: Maschile

Re: [Risolto]Numero Triangolare in Java

Messaggio da NGA1997 »

ciao io la ho fatta cosi e funziona di brutto

Codice: Seleziona tutto

import java.util.Scanner;

public class numeroTriangolare{
	public static void main(String[]arg){
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		System.out.println(numeroTriangolare(n));

	}

	public static int numeroTriangolare(int n){
		if(n==0)
			return 0;
		return n+numeroTriangolare(n-1);
	}
}
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti