struct fraction fractionMultiply(struct fraction a, struct fraction b) { struct fraction init = fractionCreate(0, 0); if (a.divisor == 0 || b.divisor == 0) return init; // firstly convert both fractions to improper form a.remainder += a.whole * a.divisor; b.remainder += b.whole * b.divisor; a.whole = 0, b.whole = 0; return fractionCreate(a.remainder * b.remainder, a.divisor * b.divisor); }
struct fraction fractionSubtract(struct fraction a, struct fraction b) { struct fraction init = fractionCreate(0, 0); if (a.divisor == 0 || b.divisor == 0) return init; if (b.whole != 0) b.whole = -b.whole; else b.remainder = -b.remainder; return fractionAdd(a, b); }
int main (void) { struct fraction a, b, c, d, r, bad; a = fractionCreate (5, 6); b = fractionCreate (8, 9); c = fractionCreate (56, 160); d = fractionCreate (35, 150); bad = fractionCreate (8, 0); struct fraction e=fractionCreate(31,0); fractionPrint(e); r = fractionAdd (a, b); fractionPrint(r); r = fractionSubtract (c, d); fractionPrint(r); r = fractionMultiply (a, b); fractionPrint(r); r = fractionDivide (c, d); fractionPrint(r); r = fractionAdd (a, bad); fractionPrint(r); r = fractionAdd (b, r); fractionPrint(r); e=fractionAdd(b,fractionAdd(a,bad)); fractionPrint(e); return 0; }
struct fraction fractionAdd(struct fraction a, struct fraction b) { struct fraction result = fractionCreate(0, 0); if (a.divisor == 0 || b.divisor == 0) return result; // The addition of fractions a and b here, where a and/or b are possibly // negative, is done in mixed form, WITHOUT firstly converting to improper // form to decrease the chance of integer overflows. int signA = (a.whole != 0 && a.whole < 0 || a.remainder < 0) ? -1 : 1; int signB = (b.whole != 0 && b.whole < 0 || b.remainder < 0) ? -1 : 1; result.whole = a.whole * signA + b.whole * signB; result.divisor = a.divisor * b.divisor; // positive, unsimplified // temporary variable that holds the sum's numerator (unsimplified) int t = abs(a.remainder * b.divisor) * signA; t = t + abs(b.remainder * a.divisor) * signB; // printf("signA signB: %d %d\n", signA, signB); // printf("basic sum: %d %d\\%d\n", result.whole, result.divisor, t); // correct the (t / result.divisor) term if (abs(t) > abs(result.divisor)) // convert to mixed fraction result.whole += t / abs(result.divisor); // printf("result.whole + (t / result.divisor) = + %d\n", t / result.divisor); // simplify remainder ÷ divisor (using the gcd) int A = result.divisor; // divisor (usually the bigger, so use as A for GCD) int B = abs(t % result.divisor); // remainder int tmp, copyA = A, copyB = B; // printf("A B: %d %d\n", A, B); while (B != 0) // A = gcd(A, B) tmp = B, B = A % B, A = tmp; // printf("gcd(A, B) = %d\n", A); result.remainder = copyB / A; result.divisor = copyA / A; return result; }
void fractionPrint (struct fraction f) { struct fraction g= fractionCreate(f.numerator,f.denominator); //if numbers are positive without 1 as denominator or 0 as numerator if(g.denominator>0&&g.denominator!=1&&g.numerator>=0) { if(g.numerator<g.denominator) { printf("%d/%d\n",g.numerator,g.denominator); } //converts improper fraction to mixed number else { int ctr=0;//counts whole numbers while(g.numerator>g.denominator) { g.numerator-=g.denominator; ctr++; } printf("%d %d/%d\n",ctr,g.numerator,g.denominator); } } //for negative fractions if(g.numerator<0) { g.numerator= g.numerator*(-1);//converts to absolute value printf("-");//print negative symbol if(g.numerator<g.denominator) { printf("%d/%d\n",g.numerator,g.denominator); } //converts improper fraction to mixed number else { int ctr=0; while(g.numerator>g.denominator) { g.numerator-=g.denominator; ctr++; } printf("%d %d/%d\n",ctr,g.numerator,g.denominator); } } if(g.denominator<0) { g.denominator=g.denominator*(-1);//converts to absolute value printf("-");//print negative symbol if(g.numerator<g.denominator) { printf("%d/%d\n",g.numerator,g.denominator); } //converts improper fraction to mixed number else { int ctr=0; while(g.numerator>g.denominator) { g.numerator-=g.denominator; ctr++; } printf("%d %d/%d\n",ctr,g.numerator,g.denominator); } } //if the denominator is 0 if(g.denominator==0) { printf("Divide by zero!\n"); } //if the denominator is 1, only output the numerator if(g.denominator==1) { printf("%d\n",g.numerator); } }