Az alábbi feladatot hogyan kellene megoldani Java programozásban?
"100*100*100 = 10 millió kombináción végigpörög."
Ez igazából 101*101*101 :) És nem 10 millió, hanem kb. 1 millió.
"Nem, leginkább azzal lehetne optimalizálni, hogy tisztán matekos fejjel felírjuk a 21s + 8k + 3j = 600 diofantoszi egyenletet és megoldjuk. Akkor nem kell végigpörgetni 10 millió megoldáson, elég lenne 2-szer legkisebb közös többszöröst számolni."
De azért írunk programot, hogy ne kelljen kiszámolni. Hanem a program erőből oldja meg.
A tied az tényleg megoldja erőből, de azért kicsit lehet rajta okosítani. Nyilván ezt meg lehet tenni sokféleképpen.
Én így csinálnám:
for (int s = 0; s <= CNT_ALL; s++) {
for (int k = 0; k <= CNT_ALL-s; k++) {
int j = CNT_ALL-s-k
checkSol(s,k,j)
}
}
Így máris 1 millió helyett csak 101+100+99+...+1=5151 esetet kell végignéznie. Vagyis csak a 200-ad részét.
7884125 nevű felhasználó válasza:
System.out.println("lehetséges megoldások [s;k;j]:");
for (int s = 0; s <= 100; s++) {
for (int k = 0; k <= 100; k++) {
for (int j = 0; j <= 100; j++) {
if (21 * s + 8 * k + 3 * j == 600 && s + k + j == 100) {
System.out.println("[" + s + ";" + k + ";" + j + "]");
}
}
}
}
Ezt jól megoldotta a kolléga de arra figyelj hogy kérdés mennyi állatot!!! A végén így használd System.out.println("[" + s/6 + ";" + k/6 + ";" + j/6 + "]");
Bocsi ,hogy közbe szóltam :)
Ez a jó igen System.out.println("[" + s + ";" + k + ";" + j + "]");
Csak lusta voltam megnyitni a netbeans-t és lefuttatni.. Fejbe meg már hülyülök megfele :D
Utolsónak: szép megoldás, bár a kollégáé 'hatékonyabbnak' tűnik egy fokkal.
Egyébként nem hajdúsági, nyírségi/ szabolcsi vagy?
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!