Fraction
#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
Reference
この問題について(Fraction), 我々は、より多くの情報をここで見つけました https://velog.io/@rudeh1253/Fractionテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol