분수를 기약분수(최소 항)로 만든다는 것은 1을 제외한 어떤 수로도 분자와 분모를 동시에 나눌 수 없도록 약분하는 것을 의미합니다.
예를 들어, 24/4라는 분수의 기약분수는 6이며, 12/16이라는 분수의 기약분수는 3/4입니다.
이제 C 프로그램을 작성하여 분수를 기약분수로 약분하는 방법을 살펴보겠습니다.
예제 1: 유클리드 호제법 활용
첫 번째 방법은 유클리드 호제법을 이용해 두 수의 최대공약수(GCD)를 구한 뒤, 분자와 분모를 각각 최대공약수로 나누는 방식입니다.
#include<stdio.h>
int main(){
int x,y,mod,numerat,denomi,lessnumert,lessdenomi;
printf("enter the fraction by using / operator:");
scanf("%d/%d", &x,&y);
numerat=x;
denomi=y;
switch(y){
case 0:printf("no zero's in denominator\n");
break;
}
while(mod!=0){
mod= x % y;
x=y;
y=mod;
}
lessnumert= numerat/x;
lessdenomi=denomi/x;
printf("lowest representation of fraction:%d/%d\n",lessnumert,lessdenomi);
return 0;
}실행 결과
enter the fraction by using / operator:12/24 lowest representation of fraction:1/2
위 프로그램에서 while 루프는 나머지 연산(%)을 반복하면서 두 수의 최대공약수를 찾습니다. 루프가 종료되면 변수 x에는 최대공약수가 저장되고, 원래의 분자와 분모를 이 값으로 나누어 기약분수를 얻습니다.
예제 2: 감소 방식으로 최대공약수 찾기
두 번째 방법은 두 수 중 작은 값부터 시작해 1씩 감소시키면서, 분자와 분모를 모두 나눌 수 있는 값을 찾는 방식입니다.
//reduce the Fraction
#include <stdio.h>
int main() {
int num1, num2, GCD;
printf("Enter the value for num1 /num2:");
scanf("%d/%d", &num1, &num2);
if (num1 < num2){
GCD = num1;
} else {
GCD = num2;
}
if (num1 == 0 || num2 == 0){
printf("simplified fraction is %s\n", num1?"Infinity":"0");
}
while (GCD > 1) {
if (num1 % GCD == 0 && num2 % GCD == 0)
break;
GCD--;
}
printf("Final fraction %d/%d\n", num1 / GCD, num2 / GCD);
return 0;
}실행 결과
Enter the value for num1 /num2:28/32 Final fraction 7/8
이 프로그램은 먼저 두 수 중 작은 값을 초기 최대공약수 후보로 설정합니다. 그런 다음 while 루프 안에서 해당 값이 분자와 분모 모두를 나눌 수 있는지 확인하고, 가능하면 루프를 빠져나와 약분을 수행합니다. 또한 분자나 분모가 0인 경우 무한대(Infinity) 또는 0으로 처리하는 예외 처리도 포함되어 있습니다.
정리
두 가지 방법 모두 while 루프를 활용해 최대공약수를 구하고 이를 이용해 분수를 기약분수로 만듭니다. 유클리드 호제법은 연산 횟수가 적어 더 효율적이며, 감소 방식은 직관적으로 이해하기 쉬운 장점이 있습니다. 상황에 맞게 적절한 방법을 선택해 사용하면 됩니다.