Fraction

PGD·2022년 1월 15일
0
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

typedef struct fraction {
    int numerator;
    int denominator;
} Fraction;

int getGCD(int numA, int numB) {
    if (numA < numB) {
        return getGCD(numB, numA);
    } else {
        int remainder = numA % numB;
        if (remainder == 0) { return numB; }

        return getGCD(numB, remainder);
    }
}

int getLCM(int numA, int numB) {
    int gcd = getGCD(numA, numB);

    return (int)(numA * numB / gcd);
}

void reduceFractionToLowestTerm(Fraction* f) {
    int gcd = getGCD((*f).numerator, (*f).denominator);

    (*f).denominator /= gcd;
    f->numerator /=gcd;
}

Fraction addFraction(Fraction f1, Fraction f2) {
    int lcm = getLCM(f1.denominator, f2.denominator);

    f1.numerator *= (lcm / f1.denominator);
    f2.numerator *= (lcm / f2.denominator);
    Fraction result = { f1.numerator + f2.numerator, lcm };
    reduceFractionToLowestTerm(&result);

    return result;
}

Fraction multiplyFraction(Fraction f1, Fraction f2) {
    Fraction result = { f1.numerator * f2.numerator, f1.denominator * f2.denominator };
    reduceFractionToLowestTerm(&result);

    return result;
}

Fraction divideFraction(Fraction f1, Fraction f2) {
    Fraction result = { f1.numerator * f2.denominator, f1.denominator * f2.numerator };
    reduceFractionToLowestTerm(&result);

    return result;
}

Fraction parse(char* str) {
    int i = 0;
    while (true) {
        if (strlen(str) - 1 <= i) {
            
            return (Fraction) { 0, 0 };
        }

        if (str[i] == '/') { break; }
        i++;
    }
    int middle = i;
    i--;

    int numerator = 0, denominator = 0;
    int decimal = 1;

    for ( ; i >= 0 ; i--) {
        if (isdigit(str[i])) {
            numerator += (str[i] - '0') * decimal;
            decimal *= 10;
        }
    }

    decimal = 1;

    for (int j = strlen(str) - 1; j > middle; j--) {
        if (isdigit(str[j])) {
            denominator += (str[j] - '0') * decimal;
            decimal *= 10;
        }
    }

    Fraction result = { numerator, denominator };

    return result;
}

void printFraction(Fraction f) {
    printf("%d / %d\n", f.numerator, f.denominator);
}

int main() {
    Fraction f1 = parse("13 / 5");
    Fraction f2 = parse("27/10");
    Fraction f3 = parse("8 / 7");
    Fraction f4 = parse("23/69");

    printFraction(f1);
    printFraction(f2);
    printFraction(f3);
    printFraction(f4);

    reduceFractionToLowestTerm(&f4);
    printFraction(f4);

    printFraction(addFraction(f1, f2));
    printFraction(multiplyFraction(f1, f2));
    printFraction(divideFraction(f2, f4));

    return 0;
}
  • 실행 결과
13 / 5
27 / 10
8 / 7
23 / 69
1 / 3
53 / 10
351 / 50
81 / 10
profile
student

0개의 댓글