Mi a hiba ebben a megoldasban?
https://www.gyakorikerdesek.hu/szamitastechnika__programozas..
Olvastam ezt a kerdest es gondoltam megcsinalom gyakorlaskeppen, itt a kodom: [link]
Java-ban csinaltam mert azt tanulok most. A kerdezo peldajara jol mukodik, de nagy szamok eseten sokszor negativ erteket ad vissza. Nagy meretu tombre pedig nagyon lassu. 100000 meretu tombre 15 masodperc alatt fut le nekem es a feladat szerint 200000 meretu lehet maximum a tomb.
Mit rontok el?
1, Azok a nagy számok, amikre negatív értéket ad, összeszorozva is elférnek egy int-ben?
2, Nyilván azért lassú, mert a brute force megoldásod nem az optimális algoritmus.
Ha még csak most tanulsz programozni, akkor ez a feladat nem neked való.
Erre nem gondoltam, de ha az osszeg valtozo tipusat long-ra valtoztatom akkor is kapok negativ szamokat. Pedig 2147483647^2 belefer 64 bitbe.
Mi az optimalis algoritmus? Ranezesre nem tunt nehez feladatnak azert probaltam meg.
Ha én ilyet írnék, annak az algoritmusa nagyvonalakban így nézne ki:
tomb = [2,4,7]; out = amount = result = 0;
AMÍG tomb hossza >= 1 ADDIG{
FOR (i = 1; i < tomb hossza; i++){
out += tomb[0] * tomb[i];
}
tomb[0] törlése;
amount += out;
out = 0;
}
result = amount % 1000000007;
Mit csinál ez? Egy ciklusban beszorozza a tömb 1. elemét az utána következő összes többivel, majd törli az 1. elemet, és mindezt addig csinálja, amíg már csak 1 elem marad a tömbben. Közben a részeredményeket hozzáadja egy változóhoz, majd a végén kiszámolja a modulust.
Ahogy halad a művelet vége felé, annál kevesebb memóriát igényel a feladat, mert a tömb elemeinek száma folyamatosan csökken.
6-os ez nem ugyanazt csinalja mint az en megoldasom, csak meg lassabb mert torolgetsz is?
Hogy torlod egyaltalan egy tomb elemet? Max az erteket tudod allitani nem?
A negativ ertekeken ez hogy segit?
A kódodat nem néztem meg, viszont algoritmust kértél, ami tudomásom szerint nyelvfüggetlen. A JAVA-hoz nem értek, a fenti példám JavaScript-ben tökéletesen lefut. Ha nem a tömb 1. elemének törölgetését választanám, akkor 2 FOR ciklussal dolgoznék. A végeredmény ugyanaz. (Amint látom már a kódodat, a tiéd is így működik.)
Negatív értékek elkerüléséért meg használj BigIntegert. Azért kapsz negatív értéket, mert nem fér bele a végeredmény a változó típusába.
Tehat a te algoritmusod meg az enyemnel is lassabb. Ez volt az egyik problema a kettobol, hogy lassu.
BigInteger Java-ban ok, de sok mas nyelvben nincs (ugy latom az eredeti kerdes pl C++). De BigIntegerrel a modulonak sem lenne semmi ertelme. Gondolom azert ker modulot a feladat hogy nyelvfuggetlenul megoldhato legyen. En csak azert csinaltam Java-ban mert azt tanulok.
További kérdések:
Minden jog fenntartva © 2025, 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!