Forum » Programiranje » Optimizacija kode [C#]
Optimizacija kode [C#]
jizzer ::
Zdravo!
Ker mi je na praksi dolgčas sem se spravil delat primerov iz Projecteulerja. Nikoli prej še nisem naletel na kako stvar ki bi res dolgo rabla da se dokonča, sedaj pa me ravno to zajebava da zelo dolgo čakam na razultat.
Gre se za Problem 12
Sam sem naredil program ki deluje (sem probal za številko 28)
Še nikoli se mi ni zgodilo da bi moral kodo zoptimizirat, zdaj pa nevem kak. Študiram že en čas zraven kaj bi lahko skrajšal, kje bi se dalo, ampak še enostavno nimam tolko znanja.
Hvala za pomoč...
Ker mi je na praksi dolgčas sem se spravil delat primerov iz Projecteulerja. Nikoli prej še nisem naletel na kako stvar ki bi res dolgo rabla da se dokonča, sedaj pa me ravno to zajebava da zelo dolgo čakam na razultat.
Gre se za Problem 12
The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be: 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... Let us list the factors of the first seven triangle numbers: 1: 1 3: 1,3 6: 1,2,3,6 10: 1,2,5,10 15: 1,3,5,15 21: 1,3,7,21 28: 1,2,4,7,14,28 We can see that 28 is the first triangle number to have over five divisors. What is the value of the first triangle number to have over five hundred divisors?
Sam sem naredil program ki deluje (sem probal za številko 28)
class Program { public static bool Divisors(long number) { long j=0; for (long i = 1; i <= number; i++) { if (number % i == 0) j++; } if (j >= 500) return true; else return false; } static void Main(string[] args) { long i = 0, j = 0, vs = 0, vs2 = 0; for (j = 1; j <= 999999; j++) { vs = vs + j; // Console.WriteLine(vs); if (Divisors(vs)) { Console.WriteLine(vs); break; } else Console.Write("."); } Console.WriteLine("Ni..."); //to ignorirajte... Console.Read(); } }
Še nikoli se mi ni zgodilo da bi moral kodo zoptimizirat, zdaj pa nevem kak. Študiram že en čas zraven kaj bi lahko skrajšal, kje bi se dalo, ampak še enostavno nimam tolko znanja.
Hvala za pomoč...
- spremenil: jizzer ()
Spura ::
for (long i = 1; i <= number; i++) { }
Za zacetek, ko preverjas delitelje gres samo do korena stevila (in valda pol pristejes 1, ker je stevilo samo vedno svoj delitelj).
Zgodovina sprememb…
- spremenil: Spura ()
GupeM ::
Tukaj pa je matematika tvoj prijatelj: Če je neko število x deljivo z 2, potem je tudi z x/2.
Če vzamem za primer x=28:
Deljivo je z 1, torej je tudi z 28/1 = 28
Deljivo je z 2, torej je tudi z 28/2 = 14
Deljivo je s 4, torej je tudi z 28/4 = 7.
Če vzamem za primer x=28:
Deljivo je z 1, torej je tudi z 28/1 = 28
Deljivo je z 2, torej je tudi z 28/2 = 14
Deljivo je s 4, torej je tudi z 28/4 = 7.
jizzer ::
double b = Math.Sqrt(number); for (long i = 1; i <= b+1 ; i++)
sicer se program zaključi v 3 sekundah, ampak razultat ni pravilen, pa tudi sam ne razumem zakaj bi šel do korena števila?
Če je koren od 28, 5,219(pa še nekaj decimalk), potem for preverja če je 28 deljivo z števili od 1-5... kar pa negre skozi ker je deljivo tudi z 14 naprimer in z 7... Hvala za pomoč :)
Sicer matematika mi ugaja ampak ni mi to jasno...
GupeM ::
V for zanki ne smeš imet b+1 ampak je dovolj samo b.
Tam kjer preverjaš če je number deljiv z i, potem prištej j+=2, saj z enim rezultatom najdeš v bistvu dva.
Tam kjer preverjaš če je number deljiv z i, potem prištej j+=2, saj z enim rezultatom najdeš v bistvu dva.
Randomness ::
@jizzer: Se popravljam, moj prejšnji hint je res napačen. Svetujem ti, da se držiš GupeM-tove ugotovitve. Do rezultata se da priti prej kot v sekundi.
Smurf ::
Zdej bom sicer pokvaru najbolj zabaven del teh nalog (iskanje formul), ampak glede na to da si vprasal:
x = trikotnisko stevilo
n = zaporedno trikotnisko stevilo
Velja:
x=n * (n+1)/2 ce je n lih
x=n/2 * (n+1) ce je n sod
Npr ce je x = 28 (7 zaporedno stevilo), n je lih torej 28 = 7 * 4
Tko razbijes cifro na 2 manjsi, kar se da dosti hitreje razbiti na delitelje.
x = trikotnisko stevilo
n = zaporedno trikotnisko stevilo
Velja:
x=n * (n+1)/2 ce je n lih
x=n/2 * (n+1) ce je n sod
Npr ce je x = 28 (7 zaporedno stevilo), n je lih torej 28 = 7 * 4
Tko razbijes cifro na 2 manjsi, kar se da dosti hitreje razbiti na delitelje.
Smurf ::
Mislim sem prafaktorje*
Ko imas prafaktorje, dobis takoj ven stevilo deliteljev: http://mathschallenge.net/library/numbe...
Ko imas prafaktorje, dobis takoj ven stevilo deliteljev: http://mathschallenge.net/library/numbe...
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Skripal (strani: 1 2 3 )Oddelek: Loža | 31918 (17667) | Pac-Man |
» | PythonOddelek: Programiranje | 3048 (1734) | d_DJ |
» | [C#] Prosim pomagajte! Potrebujem program, ki bi pobiral podatke iz ene straniOddelek: Programiranje | 2752 (2362) | David1994 |
» | Kje je fora takih mailov, ki jih dobivam?Oddelek: Loža | 2876 (2489) | Sandi79 |
» | Pomoč pri MySQL in PHP...Oddelek: Programiranje | 1820 (1688) | darh |