Kezdőoldal » Számítástechnika » Programozás » Prímtényezős felbontás,...

Prímtényezős felbontás, illetve hatványok kiíratása és megszámlálása C#-ban. Hogyan?

Figyelt kérdés

Üdv!


Hogyan lehetne megoldani a következő feladatot C#-ban? A lényeg, hogy van egy csomó 6-7 számjegyű számom és prímtényezőkre kellene bontani őket, illetve ki kellene íratni a hatványokat (pl. 2 a harmadikon) és megszámolni, hogy hány hármas van összesen (beleértve a prím hármasokat és a hatványon lévő hármasokat is).


A számokat sikerült eltárolnom egy listában és kiírnom őket foreach ciklus használatával, de a prímtényezős felbontásnál elakadtam. Próbáltam sokféleképpen, de sehogy sem sikerült rendezetten kiíratnom a képernyőre.


A kódom így néz ki:

int[] input = { 157890, 547893, 568791, 254782, 143000, 113373, 258147, 698247, 588200, 690000, 1594323, 1767172329,

9261000, 1045102, 1752166, 5813385, 2899196, 7715001, 5903190, 8335564, 3416327, 6500100, 2190577, 8251793, 8876375, 7275565, 5052427, 9213608, 5497838, 2146536, 4050392, 2324978, 6864951, 9356039, 8909145, 7918586, 2689550, 4685151, 6106332, 7698028, 4424190, 5468615, 6498595, 9209539, 9729301, 1568936, 7363822, 1110231, 6396570, 9916585, 8380355, 6185950, 6637404, 9705715, 4266238, 7614187, 4919434, 5597403, 7562562, 1968594, 1122384, 5870612, 7830968, 5027488, 1938046, 9395946, 5738894, 6685273, 5809157, 4489041, 7007193, 9756212, 7257402, 5220878, 2911443, 1215651, 8166983, 9433383, 2604195, 7401989, 4035018, 4188798, 5559286, 6582936, 2657128, 3305011, 3892086, 3263553, 1862269, 1771766, 7849485, 4758338, 2343563, 4838380, 1516428, 1305270, 1526518, 2997342, 5200727, 1281011, 5895935, 6197296, 1525494, 6922701, 5755666, 8633577, 8039067, 2001186, 7821705, 5383399, 3372970, 7779351, 3484537 };

List<int> szamok = new List<int>(input);


foreach (int item in szamok)

{

Console.WriteLine(item);

}


A prímtényezős felbontást is a foreach ciklusban kezdtem el megírni, de mint feljebb említettem, azzal már gondjaim akadtak.


A válaszokat előre is nagyon köszönöm!



2017. aug. 29. 19:29
 1/3 anonim ***** válasza:
0%
Ez így eddig nulla.
2017. aug. 29. 19:38
Hasznos számodra ez a válasz?
 2/3 anonim ***** válasza:
100%

A kérdés, mennyire akarod komplikálni a dolgot. Lehetne úgy megcsinálni, hogy egy külön osztályt hozol létre a prímek generálására, ami statikus tagban tárolja a már kigenerált prímeket, így nem kell azokat újra és újra legenerálni. Lehetne úgy csinálni, hogy nem a külső ciklus nem a számtömbön megy végig, hanem a prímeken, minden prímhez végigmész a tömbön és kiválasztod belőle a prímtényezőket. Enneka hátulütője, hogy minden számhoz szimultán számon kell tartani az aktuális felbontását. VAGY maradunk az egyszerű megoldásnál, és minden egyes számhoz elkezded végigvenni a prímszámokat, és minden egyes prímszámmal addig osztod, amíg maradék nélkül osztható vele. (Tehát lenne egy for ciklus, ami végig megy a számokon, és azon belül lenne egy while ciklus, ami azosztást, és a prímgenerálást végzi)


using System.Collections.Generic;


//...


for(int i=0; i<input.Count(); i++)

{

        int num = input[i]; //lemásoljuk a számot, hogy ne az eredetit módosítsuk;       

        int prime = 2;

        Dictionary<int,int> primeFactors = new Dictionary<int,int>();       

        primeFactors.Add(prime,0);

        while(num>1)

        {

                if(num % prime == 0)

                {

                        num /= prime;                        

                        primeFactors[prime]++;

                }

                else

                {

                    bool isPrime = false;

                    while(!isPrime)

                    {

                        isPrime = true;

                        prime++;

                        int limit = (int)(Math.Floor(Math.Sqrt(prime)));

                        for(int k=2; k<=limit && isPrime ; k++)

                        {

                            if(prime % k == 0)

                                isPrime = false;

                        }

                    }                   

                    primeFactors.Add(prime,0);

                }

        }

       

        Console.WriteLine("Szám {0}:",input[i]);

        foreach(KeyValuePair<int,int> primeFactor in primeFactors)

        {

            if(primeFactor.Value > 0)

                Console.WriteLine(" Prím: {0}, kitevő: {1}", primeFactor.Key, primeFactor.Value);

        }

}



Igyekeztem nem túlkomplikálni a kódot, hogy viszonylag jól érthető legyen. Ez minden számhoz megkeresi a prímtényezőket, és szépen kiírja őket. Megszámolni a hármasokat már a te dolgod lesz :)

2017. aug. 29. 20:34
Hasznos számodra ez a válasz?
 3/3 A kérdező kommentje:
Nagyon köszönöm, így már sikerült. :)
2017. aug. 30. 11:12

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!