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);
}
először is, sztem a while ciklusba te n==1et akarsz.
pl 2 esetén 2%2 az 0, 2/2 az 1, és kiírja a 2est.
a második felét nem értem nagyon hogy mit akarsz, de egy kapcsoszárójel lemaradt az tuti. viszont sztem a prímszámokkal kellene végigmenni, az első while ciklushoz hasonló módon. nemtudom miért van ez a for 2 meg for 3 benne.
hát valahogy úgy csinálnám, ha jól emlékszem a matekra, a lényeg az, hogy 2-től kezdve el kell kezdeni osztogatni a prímszámokkal a számunkat.
num=18 (pl)
prim=2
tehát, lenne egy nagy while(num==1){
itt keresnénk egy prim, vagy a rákövetkező prímszámot. első esetben prim==2, szal meg is találtuk.
valami olyasmi hogy:
bool megtalalta=false;
while(megtalalta==false){
bool correct=true;
for (int i=2;i<prim/2;i++){
if (prim%i==0)
correct=false;//találtunk egy számot ami osztható a prímmel maradék nélkül szal prim az nem prím szám!
}
if (correct==false)
prim++;//nezzuk a köv számot!
else
megtalalta=true;
}
itt elvileg van egy jó prím számunk. először a kettő, aztán a 3, aztán az 5, stb...
szóval most ezzel a prím számmal kell megcsinálni, amit te a kettővel csináltál
printf(prim+"^");
int hanyadik=0;
while(num%prim==0)
{
num=num/prim;
hanyadik=hanyadik+1;
}
printf(hanyadik);//így persze lehet hogy kiírja azt is hogy pl 2^0 ami 1 szal nem gáz.
}
elvileg valami ilyesmi, de nem teszteltem, és nehéz így programozni hogy 5 sorom van amit egyszerre látok :D
mégegy hiba: for (int i=2;i<prim/2;i++){ helyett for (int i=2;i<=prim/2;i++){
így 3nál 2<=1 nem igaz, de 4nél 2<=2 már igaz, tehát meg fogja nézni azt hogy i az 2, és 4%2 az 0, szal rájön hogy a 4 nem jó.
bool megtalalta=false;
while(megtalalta==false){
bool correct=true;
for (int i=2;i<=prim/2;i++){
if (prim%i==0)
correct=false;//találtunk egy számot ami osztható a prímmel maradék nélkül szal prim az nem prím szám!
}
if (correct==false)
prim++;//nezzuk a köv számot!
else
megtalalta=true;
}
itt!
Először indulunk a kettővel. prim==2. megnézzük hogy ez jó-e, ha nem, akkor növeljük eggyel.
akkor nem jó egy szám, ha találunk egy önmagánál kisebb, és egynél nagyobb számot, amivel osztható. Sőt, igazából nem is kell önmagánál kisebb, hanem önmagának a feléig is elég, hiszen pl 10 biztosan nem osztható 6al, hiszen 6*2 már nagyobb mint 10, szal érted...
így először kettővel osztogatjuk a számot, aztán amikor már kettővel nem osztható, de még mindig nagyobb mint 1 a szám, akkor 3mmal kezdjük el osztogatni. aztán 5el, stb...
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!