Valaki kijavítaná nekem az alábbi programot? Nagyon hálás lennék
A feladat az hogy írjuk ki a számot törzstényezőire bontva.
pl: 18 kiír:2*3^2
Itt a program amit megírtam de valamiért nem működik.
Valaki ki tudná nekem javítani?
Előre is nagyon szépen köszönöm.
int n, i, j, k;
k=0;
printf("n=");
scanf("%d", &n);
while(n%2==0)
{
n=n/2;
if(n==0)
printf("2");
else
printf("2*");
}
for(i=3; i<=n-1; i++)
{
for(j=2; j<=n-1; j++)
{
if(i%j==0)
k=k+1;
}
if(k==0)
if(n%i==0)
{
n=n/i;
if(i==n-1)
printf("%d", i);
else
printf("%d*", i);
}
Nem értem, hogy miért így csinálod.
1) Szükséged van az inputra (x) illetve annak a négyzetgyökére (sqrt_x).
2) Tudnod kell, hogy milyen prímekre teszteltél már, ehhez pedig építened kell egy listát, mondjuk egy array-t (d = [])
Elkezdesz szépen fölfelé haladni n=2-vel kezdve.
- Első kérdés: n értéke meghaladta-e sqrt_x-et? Ha igen, akkor nics értelme tovább vizsgálni, az utolsó x értéket be kell rakni az array végébe, és kiíratni az array-t. (persze rendezgetheted, hogy a 2*2*2*2 helyett 2^4-et írjon, de az a csicsázás, nem a lényeg.)
- Második kérdés: n osztója-e x-nek. Ha igen, akkor gyorsan elosztod vele, az eredményt beírod x helyére, n értékét meg elteszed az array következő pozíciójába. Tehát ha x==10 volt, akkor n==2 esetén x = 5 és d = [2] lesz. Az új x-re megint elkezded a fölfelé menést.
Ha viszont n nem osztója x-nek, akkor n=n++ , és kezded vizsgálni, hogy az vajon osztója-e. Tehát lényegében két egymásba ágyazott loop.
Namost elvileg le lehetne tesztelni az új n-eket-et, hogy prím-e, de ha alulról haladsz fölfelé és már "kigyűjtötted" a lenti prímeket, akkor mindig előbb kapsz prím osztót, mint nem prímet.
Ha a szám gyökéig nem kapsz osztót, akkor maga az input egy prím.
Tehát mondjuk az 56 esetében
n == 2, a gyöknél kisebb, osztó, tehát x új értéke 56/2 = 28. d == [2]
Újra kezded a ciklust x == 28, n == 2, újra osztó, d == [2, 2]
újra kezded x == 14-re, ekkor már d == [2, 2, 2] x == 7
Végül vizsgálod a hetet (ugye gyököt vonsz) 2-vel nem osztható, n==3, az meg már nagyobb a gyöknél, tehát a 7 prím, berakod az array végébe, kész: d == [2, 2, 2, 7].
Ha az 59-et kapod, akkor a gyöke 7,6, tehát n == 8-nál száll majd ki a program.
Kezdi az osztogatást n==2-vel, nem osztó, n==3, nem osztó, n==4, nem osztó, stb, n==8-ig nem talál osztót, tehát 59 prím.
Ennyi.
Előző: a felbontás és a prímkeresés ugyanaz a dolog. Ugyanis az utolsó tényező esetén mindig csak prímkeresés zajlik, hogy eldöntsd, hogy ez már az utolsó jegy-e. Márpedig nagy prímeknél azért a gyök elég sokat jelent, pl a 3571: nem mindegy, hogy 57-szer vagy 3571-szer futtatod a ciklust. Jó, valójában tényleg csak optimalizálás és tényleg csak nagyon nagy prímeknél lesz érezhető a különbség a mai számítógépek számítási kapacitása mellett, de azért jó az. ;)
Amúgy azért írtam ilyen hosszút én is, mert nem láttam, hogy van párbeszéd.
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!