Sunday, March 25, 2007
C언어] 분수 약분 함수 구현 예제 소스; Reduce a Fraction
C에서 분수를 약분하는 방법입니다. C언어에는 분수를 약분하는 함수가 없기에 직접 구현해 주어야 합니다.
int* reduceFraction(int bunja, int bunmo);
이 함수가 약분 함수인데, 분자와 분모를 인수로 넣어주면, 약분한 결과를 정수 배열로 반환합니다. 그 정수 배열에는 분자와 분모가 들어 있습니다.
소스 파일명: example.cpp
분수 약분 계산기 / 분자 분모 마이너스 부호 처리: ▶▶ 분수 약분 계산기: reduce a Frac Calc
int* reduceFraction(int bunja, int bunmo);
이 함수가 약분 함수인데, 분자와 분모를 인수로 넣어주면, 약분한 결과를 정수 배열로 반환합니다. 그 정수 배열에는 분자와 분모가 들어 있습니다.
분수 약분 예제
소스 파일명: example.cpp
#include <stdio.h>
#include <math.h>
void printFraction(int* bunsu);
int* reduceFraction(int bunja, int bunmo);
int gcd(int a, int b);
int main(void) {
// 5/10 (10분의 5)
printFraction(reduceFraction(5, 10));
// 출력 결과: 1/2
// 1/2 (2분의 1)
printFraction(reduceFraction(1, 2));
// 출력 결과: 1/2
// 2940/3150 (3150분의 2940)
printFraction(reduceFraction(2940, 3150));
// 출력 결과: 14/15
// 6/63 (63분의 6)
printFraction(reduceFraction(6, 63));
// 출력 결과: 2/21
// 63/6 (6분의 63)
printFraction(reduceFraction(63, 6));
// 출력 결과: 21/2
// 1/1 (1분의 1)
printFraction(reduceFraction(1, 1));
// 출력 결과: 1/1
// 555/555 (555분의 555)
printFraction(reduceFraction(555, 555));
// 출력 결과: 1/1
// 0/1 (1분의 0)
printFraction(reduceFraction(0, 1));
// 출력 결과: 0/1
// 1/0 (0분의 1)
printFraction(reduceFraction(1, 0));
// 출력 결과 (에러): 0/0
// 분모가 0이 될 수는 없음
// 0/0 (0분의 0)
printFraction(reduceFraction(0, 0));
// 출력 결과 (에러): 0/0
return 0;
}
// 분수 출력 함수
// (분자 분모가 든 배열을 입력받아 출력)
void printFraction(int* bunsu) {
printf("%d/%d\n", bunsu[0], bunsu[1]);
}
// 분수 약분 함수 (Reduce a Fraction)
// 분자 분모를 입력받아, 약분 후, 분자 분모가 든 배열을 반환
int* reduceFraction(int bunja, int bunmo) {
static int frac[2];
frac[0] = bunja;
frac[1] = bunmo;
if (frac[1] == 0) { // 분모가 0일 경우에 에러 반환
frac[0] = NULL;
frac[1] = NULL;
return frac;
}
// 함수와 변수명을 모두 gcd 로 하면 "error C2064: term does not evaluate to a function taking 2 arguments" 이러 에러 발생함
int gcd_result = gcd(frac[0], frac[1]);
frac[0] = frac[0] / gcd_result;
frac[1] = frac[1] / gcd_result;
return frac;
}
// 최대 공약수 계산 함수
// (Euclidean Algorithm; Euclid's Algorithm)
int gcd(int a, int b) {
while (b != 0) {
int temp = a % b;
a = b;
b = temp;
}
return abs(a);
}
#include <math.h>
void printFraction(int* bunsu);
int* reduceFraction(int bunja, int bunmo);
int gcd(int a, int b);
int main(void) {
// 5/10 (10분의 5)
printFraction(reduceFraction(5, 10));
// 출력 결과: 1/2
// 1/2 (2분의 1)
printFraction(reduceFraction(1, 2));
// 출력 결과: 1/2
// 2940/3150 (3150분의 2940)
printFraction(reduceFraction(2940, 3150));
// 출력 결과: 14/15
// 6/63 (63분의 6)
printFraction(reduceFraction(6, 63));
// 출력 결과: 2/21
// 63/6 (6분의 63)
printFraction(reduceFraction(63, 6));
// 출력 결과: 21/2
// 1/1 (1분의 1)
printFraction(reduceFraction(1, 1));
// 출력 결과: 1/1
// 555/555 (555분의 555)
printFraction(reduceFraction(555, 555));
// 출력 결과: 1/1
// 0/1 (1분의 0)
printFraction(reduceFraction(0, 1));
// 출력 결과: 0/1
// 1/0 (0분의 1)
printFraction(reduceFraction(1, 0));
// 출력 결과 (에러): 0/0
// 분모가 0이 될 수는 없음
// 0/0 (0분의 0)
printFraction(reduceFraction(0, 0));
// 출력 결과 (에러): 0/0
return 0;
}
// 분수 출력 함수
// (분자 분모가 든 배열을 입력받아 출력)
void printFraction(int* bunsu) {
printf("%d/%d\n", bunsu[0], bunsu[1]);
}
// 분수 약분 함수 (Reduce a Fraction)
// 분자 분모를 입력받아, 약분 후, 분자 분모가 든 배열을 반환
int* reduceFraction(int bunja, int bunmo) {
static int frac[2];
frac[0] = bunja;
frac[1] = bunmo;
if (frac[1] == 0) { // 분모가 0일 경우에 에러 반환
frac[0] = NULL;
frac[1] = NULL;
return frac;
}
// 함수와 변수명을 모두 gcd 로 하면 "error C2064: term does not evaluate to a function taking 2 arguments" 이러 에러 발생함
int gcd_result = gcd(frac[0], frac[1]);
frac[0] = frac[0] / gcd_result;
frac[1] = frac[1] / gcd_result;
return frac;
}
// 최대 공약수 계산 함수
// (Euclidean Algorithm; Euclid's Algorithm)
int gcd(int a, int b) {
while (b != 0) {
int temp = a % b;
a = b;
b = temp;
}
return abs(a);
}
분수 약분 계산기 / 분자 분모 마이너스 부호 처리: ▶▶ 분수 약분 계산기: reduce a Frac Calc
tag: cpp
C언어 | C/C++ (Visual C++)
<< Home