Kezdőoldal » Számítástechnika » Programozás » Hogyan lehet az euklideszi...

Hogyan lehet az euklideszi algoritmust C#-ban megcsinálni?

Figyelt kérdés

2013. jan. 27. 11:44
1 2
 1/14 iostream ***** válasza:
73%
2013. jan. 27. 12:28
Hasznos számodra ez a válasz?
 2/14 anonim ***** válasza:

Ugyanazzal a módszerrel, mint minden más nyelv esetén.


1) fogod az algoritmus pszeudó leírását

2) fogod az adott nyelv szintaxisát

3) átírod 1)-et 2) alapján


Hol akadtál el?

2013. jan. 27. 12:49
Hasznos számodra ez a válasz?
 3/14 A kérdező kommentje:
az a helyzet hogy szinte minden működik de csak akkor ha az első szám amit megadok a nagyobb. viszont ha ha a második akkor minden számpárra azt írja ki hogy 0
2013. jan. 27. 12:52
 4/14 anonim ***** válasza:

És most mennyibe telik felcserélni a kettő számot? XD

LOL

ha fordítva nem jó cseréltesd vissza...

Gondolkodj egy kicsit.

2013. jan. 27. 13:15
Hasznos számodra ez a válasz?
 5/14 anonim ***** válasza:
Ha nagyobb, cseréld meg a két számot.
2013. jan. 27. 13:16
Hasznos számodra ez a válasz?
 6/14 anonim ***** válasza:

(Opp, lassú voltam)


De ez a csere úgy látom magából az algoritmusból következik.

2013. jan. 27. 13:18
Hasznos számodra ez a válasz?
 7/14 anonim ***** válasza:

A következetesen megírt eukideszi algoritmus ,,magától'', ,,sajét logikájából adódóan'' ezt az esetet is jól kezeli, tehát nem szabadna 0-t adnia. Úgy direkt külön nem kell a megcserélést mint valami külön ,,kivételvizsgálatot'' ,,hozzátenni'' a programhoz. Most kipróbáltam a dolgot C-ben:


int eucl(int a, int b)

{

. . . int r;


. . . r = a % b;

. . . while (r != 0)

. . . {

. . . . . . a = b;

. . . . . . b = r;

. . . . . . r = a % b;

. . . }

. . . return b;

}


Ez a kód azt fejezi ki:


Elosztjuk maradékosan a-t a b-vel. Ha a maradék (r) nem nulla,

akkor újra végrehajtjuk a maradékos osztás olyan szereposztással, hogy immár az eredetileg osztóként szereplő b-t osztjuk most az előbb kapott maradékként kapott r-rel. (Tehát lényegében a szerepcsere: a helyébe b, és b helyébe r). Mindezt addig csináljuk, amíg a maradék 0 nem lesz. Az eredmény pedig az utolsó nemnulla maradék. Ezt lényegében úgy kapjuk meg, hogy addig csináljuk, amíg a maradék 0 nem lesz, és az ekkor aktuális osztó (b) az ,,előző menet'' során épp a maradék (r) szerepét töltötte be, tehát ez az utolsó nemnulla maradék.


Pl eucl (6, 4) hívása esetén:


a | b | r

6 | 4 | 2

4 | 2 | 0


Látjuk, hogy itt a 2 az utolsó nem-nulla maradék, amit akár a táblázat utolsó előtti sorából is kiolvashatnánk, de ezt akár úgy is kiolvashatnánk, hogy lemegyünk a táblázat utolsó soráig (ahol a maradék 0), és ott kiolvassuk b értékét, ami ,,ugyanaz'' a 2, mintha a táblázat utolsó előtti sorából olvastuk volna ki az r értékét.


No akkor most nézzük meg, mi van, ha megpróbáljuk ,,becsapni'' az algoritmust, és olyan esetet adunk neki amit Te is írsz, vagyis hogy most legyen a < b, pl:


eucl(4, 6):


a | b | r

4 | 6 | 4

6 | 4 | 2

4 | 2 | 0


A lényeg a második sor: az algoritmus mintegy ,,mellékhatásként'' magától megcserélte a két argumentumot, hiszen:


4-ben a 6 megvan 0-szor (hiszen ha már 1-szer venném, az túl sok lenne), marad maga a 4

4 % 6 = 4


A lényeg az, hogy mi történik, amikor a > b számokkal próbálom ki? Nézzük meg eucl(6, 4)-re! (Azt persze ):

2013. jan. 27. 14:36
Hasznos számodra ez a válasz?
 8/14 anonim ***** válasza:
(Legeslegutolsó sor az csak copypaste garbage, az csak véletlenül maradt ott)
2013. jan. 27. 14:38
Hasznos számodra ez a válasz?
 9/14 anonim ***** válasza:
Az én algoritmusomban is van még rés: nem kezeli jól a kivételes eseteteket (pl. ha a második szám épp 0). Ezt a hiányosságot mindjárt kijavítom. A javított változatra is ugyanaz vonatkozik, mint amit az előbb leírtam: az algoritmus ,,saját logikájából fakadóan'', önállóan ,,cseréli fel'' a két argumentumot, ha a < b.
2013. jan. 27. 14:45
Hasznos számodra ez a válasz?
 10/14 anonim ***** válasza:

int eucl(int a, int b)

{

. . while (b != 0)

. . {

. . . . int r = a % b;

. . . . a = b;

. . . . b = r;

. . }


. . return a;

}


Ez már jól kezeli az olyan ,,elfajuló'' ,,0-val osztós'' esetekekt is, mint pl.


eucl(12, 0) = 12

eucl(0, 0) = 0


Az előző változat ezekre hibaüzenetet adott (ott a második szám nem lehetett 0, az arra volt érzékeny). Ez a másik változat ezt az esetet ,,automatikusan'', ,,a számelméleti alapgondolat alaplogikájából fakadóan'' jól kezeli, és számelméletileg helyes válaszokat ad. Egy kicsit nehéz látni, hogy miért is működik egyáltalán ez a második változat, a futási táblázatokat kell néhány egyszerű példára elkészíteni, és abból lehet látni.

2013. jan. 27. 15:09
Hasznos számodra ez a válasz?
1 2

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!