» »

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
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 ()

Randomness ::

Hint: bisekcija

jizzer ::

Hint pa pol :) Pojma nimam o tem tako da mi nič ne pomaga :)

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.

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.

jizzer ::

Aha to pa ja :) Saj je logično samo sam tega nisem opazil, hvala :)

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.

Smurf ::

Mislim sem prafaktorje*

Ko imas prafaktorje, dobis takoj ven stevilo deliteljev: http://mathschallenge.net/library/numbe...


Vredno ogleda ...

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

Skripal (strani: 1 2 3 )

Oddelek: Loža
13131918 (17667) Pac-Man
»

Python

Oddelek: Programiranje
203048 (1734) d_DJ
»

[C#] Prosim pomagajte! Potrebujem program, ki bi pobiral podatke iz ene strani

Oddelek: Programiranje
212752 (2362) David1994
»

Kje je fora takih mailov, ki jih dobivam?

Oddelek: Loža
122876 (2489) Sandi79
»

Pomoč pri MySQL in PHP...

Oddelek: Programiranje
161820 (1688) darh

Več podobnih tem