Prímtényezős felbontás, illetve hatványok kiíratása és megszámlálása C#-ban. Hogyan?
Ü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!
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 :)
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!