ProjectEuler v C# - rychlost Vyřešeno

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Rutherther
Level 2
Level 2
Příspěvky: 227
Registrován: říjen 14
Pohlaví: Muž
Stav:
Offline

ProjectEuler v C# - rychlost

Příspěvekod Rutherther » 10 dub 2015 20:16

Ahoj, před pár dny jsem začal v ProjectElueru, většinou přijdu na to, jak úkol vyřešil, ale mám problém.. a to v rychlosti, můj počítač je pomalý a proto asi i tyto příklady počítá pomalu..

Příklad zápisu:

Kód: Vybrat vše

     BigInteger l = 600851475143;
            BigInteger primefactor = 0;
            BigInteger i = 1;
            while (i < l) {
                if (l % i == 0) primefactor = i;
                i++;
            }
            Console.WriteLine(primefactor);
                Console.ReadKey();

Tohle jsem dělal pro Largest prime factor. Čekal jsem asi 3 minuty a nic, prostě se to za 3 minuty nedokončilo, jak by šlo udělat, aby to bylo rychlejší, pokud je to vada c#, tak jaký jiný jazyk použít? Děkuji za rady

Edit: prime factor je asi něco jiného, ale to je jedno, pak to opravím, hlavně mě teď zajímá, jak to tedy zrychlit?

Reklama
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: ProjectEuler v C# - rychlost

Příspěvekod faraon » 11 dub 2015 07:32

No, tak jenom napočítat do tohohle čísla po jedné trvá mému počítači skoro hodinu a půl, přičemž jeho faktorizaci na prvočísla zvládne za zlomek sekundy. Takže tudy cesta určitě nevede!

Kód: Vybrat vše

faraon@tuxbox:~# time factor 600851475143
600851475143: 71 839 1471 6857

real    0m0.095s
user    0m0.003s
sys     0m0.041s


Z toho tvého kódu jsem vyluštil že hledáš největší číslo kterým je to tvoje N beze zbytku dělitelné (fakt to nemá být prvočíslo?). Já bych to zkusil spíš naopak, najít to nejmenší, a tím potom N vydělit pro získání výsledku.
Také nemusíš mít cyklus až do N, stačí do jeho druhé odmocniny, protože větší určitě nebude potřeba.
A s ohledem na to závěrečné dělení bych primefactor na začátku inicializoval na 1, aby ti ta nula nepřichystala drobné překvapení v případě zadání prvočísla.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Rutherther
Level 2
Level 2
Příspěvky: 227
Registrován: říjen 14
Pohlaví: Muž
Stav:
Offline

Re: ProjectEuler v C# - rychlost

Příspěvekod Rutherther » 11 dub 2015 09:01

já vlastně ani nevím, jestli to mají být prvočísla, ale spíše ne, protože v zadání bylo, že nějaké číslo má ty prime factory 5, 7, 23, chybělo by tam např. 11, 17 a navíc ja tak velké je jich malo.. Podívej se sám:

The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?

Samozřejmě nechci, abyste mi radili, taky mě napadlo, že to budou čísla, kterými to jde dělit, ale jen, když budou první (nevím, jak to popsat, takže příklad: kdyby to šlo dělit číslem 29*5, ale 29 už by tam byla, tak by to už nebyl prime factor)


Nebo ještě prvočísla, kterými to lze dělit.

Díky za radu, já na to nějak přijdu

Btw. Jak jsi zjistil, že to trvalo hodinu a půl? To jsi to nechal běžet?

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: ProjectEuler v C# - rychlost

Příspěvekod faraon » 11 dub 2015 09:20

Kód: Vybrat vše

faraon@tuxbox:~# factor 13195
13195: 5 7 13 29

Takže to má být opravdu největší prvočíslo!

No, potom tě tedy čeká faktorizace zadaného čísla na jednotlivá prvočísla, a nebo můžeš to co jsem napsal minule použít v cyklu (či rekurzi). Když najdeš nejmenší dělitel N, tak jím N vydělíš a začneš znovu hledat další nejmenší, dokud nebude N prvočíslo.

Tu dobu jsem odhadl, zkusil jsem to se setinou toho čísla a dobu vynásobil. Pro přibližný odhad a posouzení že nemá cenu to zkoušet to stačilo :lol:
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
satik
Level 6
Level 6
Příspěvky: 3509
Registrován: leden 15
Bydliště: Krkonoše
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: ProjectEuler v C# - rychlost

Příspěvekod satik » 11 dub 2015 11:20

Kód: Vybrat vše

static void Main(string[] args)
        {
            Int64 n = 600851475143;
            var primes = Euler(n);
            Console.WriteLine("{0} has primes: {1}, highest is {2}.", n, String.Join(", ", primes.ToArray()), primes.Max());
            Console.ReadKey();
        }

        static List<Int64> Euler(Int64 n)
        {
            var sqrtN = (Int64)Math.Sqrt(n);

            var primes = new List<Int64>();

            bool added = true;
            int i=2;
            while (i < sqrtN && i<n)
            {
                if (n % i == 0)
                {
                    primes.Add(i);
                    added = true;
                    n = n / i;
                }
                else
                {
                    added = false;
                    i++;
                }
            }

            if (!added)
                primes.Add(i);

            return primes;
        }


Zkusil jsem si to napsat, je to i celkem rychlé (stačí tomu na to číslo 600851475143 jen 7000 průchodů cyklem) a najde ti to všechny prvočísla (i to největší, jak je v zadání).

Psal jsem to jen asi 15 minut a moc netestoval, tak tam teoreticky může být nějaká chybka.
PC: MSI RTX 4090 Suprim X, AMD Ryzen 9 7950x3D, ASUS Crosshair HERO X6670E, 64GB RAM@6000CL30, Fractal Define Torrent, Seasonic PRIME TX 1600W, SSD Seagate Firecuda 530 M2 2TB +
4TB + 4TB SATA Micron 5200 ECO
Periferie: Samsung Odyssey G9 Neo + 2x AOC AG271QG, Razer Deathadder, Ducky Shine7, Steelseries QcK+, Beyerdynamic MMX300, Valve Index

Rutherther
Level 2
Level 2
Příspěvky: 227
Registrován: říjen 14
Pohlaví: Muž
Stav:
Offline

Re: ProjectEuler v C# - rychlost

Příspěvekod Rutherther » 11 dub 2015 16:28

Satiku, už to nepotřebuji, ale stejně díky.

Rovnou toho využiji a zeptám se.. Jaký je rozdíl mezi int, int64, int32 a int16?

Uživatelský avatar
satik
Level 6
Level 6
Příspěvky: 3509
Registrován: leden 15
Bydliště: Krkonoše
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: ProjectEuler v C# - rychlost

Příspěvekod satik » 11 dub 2015 17:05

číslo za int určuje rozsah
pokud necháš jen int, tak ten má rozsah podle architektury - v 32bit programu 32 bitů, v 64bit programu 64 bitů
PC: MSI RTX 4090 Suprim X, AMD Ryzen 9 7950x3D, ASUS Crosshair HERO X6670E, 64GB RAM@6000CL30, Fractal Define Torrent, Seasonic PRIME TX 1600W, SSD Seagate Firecuda 530 M2 2TB +
4TB + 4TB SATA Micron 5200 ECO
Periferie: Samsung Odyssey G9 Neo + 2x AOC AG271QG, Razer Deathadder, Ducky Shine7, Steelseries QcK+, Beyerdynamic MMX300, Valve Index

Uživatelský avatar
X
Elite Level 12.5
Elite Level 12.5
Příspěvky: 19360
Registrován: květen 07
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: ProjectEuler v C# - rychlost

Příspěvekod X » 11 dub 2015 17:13

Rutherther píše:... , většinou přijdu na to, jak úkol vyřešil, ...

Kdo úkol vyřešil? Hned v první větě nepřesnost, chyba, nesmysl? Ty chceš být programátor? To si nedovedu představit ...

Rutherther
Level 2
Level 2
Příspěvky: 227
Registrován: říjen 14
Pohlaví: Muž
Stav:
Offline

Re: ProjectEuler v C# - rychlost  Vyřešeno

Příspěvekod Rutherther » 11 dub 2015 19:17

Promiň za tu chybku, každý se překlikne.. Ale ty to asi bereš tak, že jsem sem vůbec napsal.. Prostě mě zajímalo, jak s tou rychlostí, jestli jde nějak udělat, aby to bylo rychlejší.. A je zde spoustu jiných příspěvků, které se ptají na docela začátečnické věci, tak proč sis vybral zrovna tento?


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Nižší rychlost internetu po rekonstrukci Příloha(y)
    od PlumJelinek » 25 lis 2024 19:54 » v Administrace sítě
    6
    4736
    od Riviera kid Zobrazit poslední příspěvek
    26 lis 2024 12:48

Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti