» »

Java Pitagorejska števila

Java Pitagorejska števila

HIP_HOP ::

V šoli smo dobili nalogo za zagovor, da moramo napisati program, ki izpiše vsa pitagorejska števila med 1 in 100.

Primer a2+b2=n2

Prosim za kakšen namig. Izbira metode in podobno...

HIP_HOP ::

Oziroma, kako naj napišem pogoj, da bo računalnik testiral če je število pitagorejsko ali ni.

rgv45vg4t335 ::

Kakšna for zanka ali dve, pa truncate in if...
MSI K9A2 Platinum@260MHz, Athlon X2 4850e@3GHz, 4GB RAM@1000MHz
Radeon HD 4850

Tutankhamun ::

Upam da nam falu...
Prva število je
3 4 5
pol pa sam množiš z 2
6 8 10
pol spet pomnožiš z 2
12 16 20
...
AMD Phenom QUAD 9950 Black Edition, 8GB

sherman ::

To niso vsa. 5^2 + 12^2 = 13^2 (napaka se odpravlja)

Ktj ::

Mogoče:
zanko za hipotenuzo in znotraj te še eno zanko za eno kateto, nato preveri če je druga kateta (int).

Tutankhamun ::

Jap, pol pa ni tko kot sm si predstavlu :)...
AMD Phenom QUAD 9950 Black Edition, 8GB

morbo ::

A 'brute force' pristop ne velja? Iteriraš skozi vsako možno vrednost za a, b in c (tri vgnezdene for zanke), ter pogledaš ali kombinacija izpolnjuje enačbo.

HIP_HOP ::

Jz sm bolj zacetnik, tko, da delamo z for, do while, int, if, else

morbo ::

Jz sm bolj zacetnik, tko, da delamo z for, do while, int, if, else

Sej to je vse kar rabiš. 'Brute force' pomeni da pregledaš vse možne kombinacije in vzameš tiste ki ti ustrezajo. Tak pristop je s stališča hitrosti neučinkovit. Verjetno za to nalogo obstaja kakšna bolj elegantna (geometrijska) rešitev. Na silo bi recimo zgledalo tako:

class Pitagora {

	public static void main(String[] args) {

		for (int a=1; a<100; a++) {
			for (int b=1; b<100; b++) {
				for (int c=1; c<100; c++) {
				
					int levaStran = (a * a) + (b * b);
					int desnaStran = (c * c);
				
					if (levaStran == desnaStran) {
						System.out.println(a + " " + b + " " + c);
					}
				}
			}
		}
	}
}

Zgodovina sprememb…

  • spremenil: morbo ()

imagodei ::

for, do while, if so povsem dovolj.

Razumet moraš problem. Napiši si psevdokodo ali nariši algoritem. Razmisli o problemu.

Za začetek: pregledoval boš števila n med 1 in 100 (v bistvu med 5 in 100). Torej nekaj rabiš delat na intervalu od 1 do 100. For zanka.

Za vsako število moraš preverit, ali se da razbiti na dve celoštevilski kateti. Ker veš, da v trikotniku a+b > c in ker veš, da je a2+b2 = b2+a2, ti ni treba preverjati enakih pogojev dvakrat in lahko izločiš vse primere, kjer ne velja a+b > c (IOW, trikotnik a=3, b=4, c=5 je enak kot trikotnik a=4, b=3, c=5). Kak if stavek ali dva.

Kar rabiš, je torej zafiksirat vrednost kateti a, nato pa pogledat, ali zanjo obstaja taka celoštevilska kateta b, da velja a2+b2=c2. Dva for stavka.

Če jo najdeš, izpišeš rezultat, drugače spremeniš vrednost katete a in spet iščeš kateto b. If stavek

Zdaj pa to prevedi v Javo.
- Hoc est qui sumus -

Tutankhamun ::

	unsigned int A, B, H;

	A = 1;

	for (A = 1; A <= 100; A++)
	{
		for (B = A + 1; B <= 100; B++)
		{
			H = A*A + B*B;
			float hh = sqrt (H);
			H = sqrt (H);
			if (hh == (float)H)
			{
				cout << A << " " << B << " " << H << endl;
			}
		}
	}


Rezultat pa nevem če je use prov:
3 4 5
5 12 13
6 8 10
7 24 25
8 15 17
9 12 15
9 40 41
10 24 26
11 60 61
12 16 20
12 35 37
13 84 85
14 48 50
15 20 25
15 36 39
16 30 34
16 63 65
18 24 30
18 80 82
20 21 29
20 48 52
20 99 101
21 28 35
21 72 75
24 32 40
24 45 51
24 70 74
25 60 65
27 36 45
28 45 53
28 96 100
30 40 50
30 72 78
32 60 68
33 44 55
33 56 65
35 84 91
36 48 60
36 77 85
39 52 65
39 80 89
40 42 58
40 75 85
40 96 104
42 56 70
45 60 75
48 55 73
48 64 80
48 90 102
51 68 85
54 72 90
56 90 106
57 76 95
60 63 87
60 80 100
60 91 109
63 84 105
65 72 97
66 88 110
69 92 115
72 96 120
75 100 125
80 84 116
AMD Phenom QUAD 9950 Black Edition, 8GB

imagodei ::

No, načeloma je tale rešitev s primerjavo c2 in a2+b2 še lepša od moje.
- Hoc est qui sumus -

HIP_HOP ::

Hvala za pomoč, pomagal sem si z Morbovo rešitvijo, ker so mi stavki bolj znani.

morbo ::

Ampak je tudi najslabša od vseh. Malo naštudiraj materjal in priredi - tako se boš vsaj naučil razumet kaj si napisal.

Tutankhamun ::

Hvala za pomoč, pomagal sem si z Morbovo rešitvijo, ker so mi stavki bolj znani

Ker je copy/paste ? :D
AMD Phenom QUAD 9950 Black Edition, 8GB

MesniBurek ::

Imam eno vprašanje in sicer imam isto nalogo vendar sem naredil na nekoliko drugačen način, zanima me pa kaj spremeniti, da ne bo izpisovalo istih števil večkrat.
.: Tutiturumtutu :.

imagodei ::

Preberi moje prejšnje sporočilo. a+b = b+a
- Hoc est qui sumus -

MesniBurek ::

Sem tudi sam začetnik in ni mi jasno kako naj izločim vse primere kjer ne velja a+b>c, a je potrebno uporabit if stavek znotraj prvega if ali kako?

Hvala za pomoč
.: Tutiturumtutu :.

Tutankhamun ::

pa sm prlep nalogo da vidmo.
AMD Phenom QUAD 9950 Black Edition, 8GB

HIP_HOP ::

Hvala za pomoč, pomagal sem si z Morbovo rešitvijo, ker so mi stavki bolj znani

Ker je copy/paste ? :D


Hecno a resnično :D:D


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

TRIKOTNI ŠTEVIL V JAVI

Oddelek: Programiranje
111360 (1181) lebdim
»

programiranje krožek(pomoč)

Oddelek: Pomoč in nasveti
442756 (1744) Marat
»

[C#] razlaga

Oddelek: Programiranje
161596 (1313) krastača
»

Generiranje kombinacij znakov

Oddelek: Programiranje
141314 (999) c0dehunter
»

Pomoč pri programčkih

Oddelek: Programiranje
152922 (2572) Mitja Bonča

Več podobnih tem