#include typedef struct { long long int numerator; unsigned long long int denominator; } FRACTION; FRACTION Fra_Add(FRACTION f1, FRACTION f2); FRACTION Fra_Sub(FRACTION f1, FRACTION f2); long long findGcd(long long a, long long b); FRACTION reduceFrac(FRACTION origin); int main() { FRACTION result, toBeAdd; int i = 0; result.numerator = 0; result.denominator = 1; toBeAdd.numerator = 1; i = 1; while (i < 11) { toBeAdd.denominator = 2 * i - 1; result = Fra_Add(result, toBeAdd); i++; toBeAdd.denominator = 2 * i - 1; result = Fra_Sub(result, toBeAdd); i++; } result.numerator *= 4; result = reduceFrac(result); printf("Result: %lld/%lu, or %lf", result.numerator, result.denominator, ((double) result.numerator)/ result.denominator); return 0; } FRACTION Fra_Add(FRACTION f1, FRACTION f2) { FRACTION result; if (f1.denominator == 0 || f2.denominator == 0) { result.denominator = 0; result.numerator = 0; return result; } long long gcd = findGcd((long long)f1.denominator, (long long)f2.denominator); result.denominator = (f1.denominator / gcd) * f2.denominator; result.numerator = f2.denominator / gcd * f1.numerator + f1.denominator / gcd * f2.numerator; return result; } FRACTION Fra_Sub(FRACTION f1, FRACTION f2) { FRACTION result; if (f1.denominator == 0 || f2.denominator == 0) { result.denominator = 0; result.numerator = 0; return result; } long long gcd = findGcd((long long)f1.denominator, (long long)f2.denominator); result.denominator = (f1.denominator / gcd) * f2.denominator; result.numerator = f2.denominator / gcd * f1.numerator - f1.denominator / gcd * f2.numerator; return result; } long long findGcd(long long a, long long b) { long long c = a % b; switch (c) { case 0: return b; break; default: return findGcd(b, c); } } FRACTION reduceFrac(FRACTION origin) { long long gcd; FRACTION result; gcd = findGcd(origin.numerator, origin.denominator); result.numerator = origin.numerator / gcd; result.denominator = origin.denominator / gcd; return result; }