ºÐ¼ö¸¦ °è»êÇÏ´Â ÇÔ¼ö¸¦
¸¸µé¾î º¸¾Ò½À´Ï´Ù.
ÃÖ´ë°ø¾à¼ö¸¦ ±¸ÇÏ´Â ±â´ÉÀ» ÇÏ´Â gcd() ÇÔ¼ö¸¦
ÀÌ¿ëÇÏ¿© °á°ú¸¦ ±â¾àºÐ¼ö·Î Ãâ·ÂÇÕ´Ï´Ù.
³ª¸ÓÁö°¡ ¾øÀ» ¶§´Â ¸ò¸¸ Ãâ·ÂÇϰí,
±× ¿Ü ºÐÀÚ°¡ ºÐ¸ðº¸´Ù Å©¸é ´ëºÐ¼ö·Î
Ãâ·ÂÇÕ´Ï´Ù.
#include <stdio.h>
#include <conio.h>
#define swap(a,b) {a^=b;b^=a;a^=b;}
/* µÎ ¼ö¸¦ ¹Ù²Ù´Â ¸ÅÅ©·Î ÇÔ¼ö */
void divide2(unsigned a,unsigned b,unsigned *m1,unsigned *m2,unsigned *m3);
unsigned gcd(unsigned a,unsigned b);
void main()
{
unsigned *x,*y,*z; /* Æ÷ÀÎÅÍ º¯¼ö x, y, z Á¤ÀÇ */
clrscr();
divide2(655,225,x,y,z);
/* *x, *y, *z¿¡ °á°ú°ªÀÌ ÀúÀåµÈ´Ù. */
if(*y==0 && *z==0) printf("%u\n", *x);
/* ³ª¸ÓÁö°¡ 0ÀÏ °æ¿ì ¸ò¸¸ Ãâ·Â */
else if(!(*x)) printf("%u/%u\n", *y, *z);
/* ¸òÀÌ 0ÀÏ °æ¿ì ³ª¸ÓÁö¸¸ ºÐ¼ö·Î Ãâ·Â */
else printf("%u %u/%u\n", *x, *y, *z);
/* ±× ¿ÜÀÇ °æ¿ì ´ëºÐ¼ö ÇüÅ·ΠÃâ·Â */
}
void divide2(unsigned a,unsigned b,unsigned *m1,unsigned *m2,unsigned *m3)
/* ³ª´©±â¸¦ ºÐ¼ö·Î °è»êÇÏ´Â ÇÔ¼ö - Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇÑ ÂüÁ¶¿¡ ÀÇÇÑ È£Ãâ */
/* À½¼ö´Â Ãë±ÞÇÏÁö ¸øÇÑ´Ù. */
{
unsigned temp; /* ÃÖ´ë°ø¾à¼ö¸¦ ÀúÀåÇÒ º¯¼ö */
*m1=(unsigned)(a/b); /* ³ª´©±âÀÇ ¸òÀ» ÀúÀå */
if(a%b==0) { *m2=0; *m3=0; return; }
/* a/bÀÇ ³ª¸ÓÁö°¡ 0ÀÎ °æ¿ì */
temp=gcd(a%b, b);
/* ³ª¸ÓÁöÀÇ ºÐÀÚ¿Í ºÐ¸ðÀÇ ÃÖ´ë°ø¾à¼ö¸¦ temp¿¡ ÀúÀå */
if(temp==1) { /* ÃÖ´ë°ø¾à¼ö°¡ 1¿Ü¿¡ ¾ø´Â °æ¿ì */
*m2=(unsigned)(a%b);
*m3=b;
} else {
/* ÃÖ´ë°ø¾à¼ö°¡ ÀÖÀ¸¸é ºÐÀÚ,ºÐ¸ð¸¦ ÃÖ´ë°ø¾à¼ö·Î ³ª´«´Ù. */
*m2=(unsigned)((a%b)/temp);
*m3=(unsigned)(b/temp);
}
}
unsigned gcd(unsigned a,unsigned b)
/* ÃÖ´ë°ø¾à¼ö¸¦ ±¸ÇÏ´Â ÇÔ¼ö - À½¼ö´Â Ãë±ÞÇÏÁö ¸øÇÑ´Ù. */
/* ¸®Åϰª : ÃÖ´ë°ø¾à¼ö */
{
int m;
if(b>a) swap(a, b); /* a>b°¡ µÇ°Ô ÇÑ´Ù. */
while(1) {
m=a-(unsigned)(a/b)*b;
if(m==0) return b;
/* m==0À̸é b°¡ ÃÖ´ë°ø¾à¼ö */
else if(m<0) return 1;
/* m<0ÀÌ µÇ¸é ÃÖ´ë°ø¾à¼ö´Â 1»Ó */
else { a=b; b=m; }
/* ±× ¿ÜÀÇ °æ¿ì ·çÇÁ¸¦ °è¼Ó µ·´Ù. */
} /* while */
}
(¼³¸í)
n0 = max( |a|, |b| )
n1 = min( |a|, |b| )
nk = nk-2 - [ nk-2 / nk-1 ] * nk-1
k=2, 3, ...
¸¸¾à nk = 0 À̸é ÃÖ´ë°ø¾à¼ö´Â nk-1 ÀÌ µÈ´Ù.
|
ÀÌ ÇÔ¼öµéÀº ºÐ¼ö³ª´°¼ÀÀ» ÇϱâÀ§ÇÑ °ÍÀÌ´Ù.
ºÐ¼ö°è»ê¶§ ¾àºÐÀ» À§ÇØ ÃÖ´ë°ø¾à¼ö¸¦ ±¸ÇÏ´Â
ÇÔ¼ö¸¦
±¸ÇöÇÏ¿´´Ù.
ÃÖ´ë°ø¾à¼ö¸¦ ±¸ÇÏ´Â ¿ø¸®´Â ´ÙÀ½°ú °°´Ù.
a, bÀÇ Àý´ë°ªÁß¿¡¼ Å« ¼ö¸¦ n0 ¿¡,
ÀÛÀº ¼ö¸¦ n1 ¿¡ ´ëÀÔÇÑ´Ù.
±×¸®°í k¸¦ 2¿¡¼ Çϳª¾¿ Áõ°¡½Ã۸é¼
°è»êÇÏ´Ù°¡
nk °¡ 0ÀÌ µÇ¸é nk-1 ÀÌ
ÃÖ´ë°ø¾à¼ö°¡ µÈ´Ù.
¸¸¾à nk °¡ 0ÀÌ µÇÁö¾Ê°í À½¼ö°¡ µÇ¸é
ÃÖ´ë°ø¾à¼ö´Â
1 ¿Ü¿£ ¾ø´Â °ÍÀÌ´Ù.
¿©±â¼ [a] ±âÈ£´Â a ÀÇ Á¤¼öºÎºÐÀ» ¶æÇÑ´Ù.
- gcd() ÇÔ¼ö
: gcd() ÇÔ¼ö´Â ÃÖ´ë°ø¾à¼ö¸¦ ±¸ÇÏ´Â ÇÔ¼öÀε¥,
¸Å°³º¯¼ö·Î ¹ÞÀº µÎ ¼ö a, bÁß ¸¸¾à b°¡ ´õ Å©¸é
µÎ ¼ö¸¦ ¹Ù²Ù¾î Ç×»ó a>b ÀÎ »óÅ·Π¸¸µç´Ù.
¿©±â¼ swap()À̶ó´Â ¸ÅÅ©·Î ÇÔ¼ö¸¦ »ç¿ëÇÏ¿´´Ù.
ÀÌ ÇÔ¼ö´Â ºñÆ®¿¬»êÀÎ XORÀ» ÀÌ¿ëÇÑ °ÍÀ¸·Î
ÇÁ·Î±×·¥ Áß°£¿¡
³¢¾î µé¾î°¡¹Ç·Î ½ÇÇà¼Óµµ°¡ ºü¸£´Ù.
´ÙÀ½À¸·Î ¹«ÇÑ·çÇÁ¸¦ ½á¼ m<=0 ÀÌ µÉ ¶§±îÁö
°è¼Ó
°è»ê½ÄÀ» ½ÇÇàÇÑ´Ù.
- divide2() ÇÔ¼ö
: ÀÌ ÇÔ¼ö´Â unsignedÇü º¯¼ö 2°³¸¦ ¹Þ¾Æµé¿© ¸ò,
³ª¸ÓÁöÀÇ
ºÐÀÚ, ºÐ¸ð¸¦ 3°³ÀÇ º¯¼ö¿¡ °¢°¢ ÀúÀåÇÑ´Ù.
°á°ú°ªÀº Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇÑ ÂüÁ¶¿¡ ÀÇÇÑ È£ÃâÀ»
ÀÌ¿ëÇÑ´Ù.
¸¸¾à ³ª¸ÓÁö°¡ 0ÀÌ¸é ºÐÀÚ, ºÐ¸ð¸¦ ¸ðµÎ 0À¸·Î
¹ÝȯÇÑ´Ù.
±×·¯¸é main()ÇÔ¼ö¿¡¼ ÀÌ °æ¿ì¸¦ ó¸®ÇØ ¸ò¸¸
Ãâ·ÂÇÏ°Ô µÈ´Ù.
µÎ ¼ö a, bÀÇ ÃÖ´ë°ø¾à¼ö°¡ 1ÀÎ °æ¿ì ºÐÀÚ¿¡´Â a%b°¡
´ëÀԵǰí,
ºÐ¸ð¿¡´Â b°¡ ±×´ë·Î ´ëÀԵȴÙ.
¸¸¾à ÃÖ´ë°ø¾à¼ö°¡ 1ÀÌ ¾Æ´Ï¸é ºÐÀÚ, ºÐ¸ð¸¦
ÃÖ´ë°ø¾à¼ö·Î
³ª´«´ÙÀ½ ´ëÀԵȴÙ.
- main() ÇÔ¼ö
: ³ª¸ÓÁö°¡ 0ÀÎ °æ¿ì ¸ò¸¸ Ãâ·ÂÇϰí,
¸òÀÌ 0ÀÌ¸é ³ª¸ÓÁö¸¸ ºÐ¼ö·Î Ãâ·ÂÇÑ´Ù.
Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇϹǷΠprintf() ÇÔ¼öÀÇ
½Ç¸Å°³º¯¼ö´Â
*x, *y, *z ¿Í °°ÀÌ ½á¾ßÇÑ´Ù.