13课第3题。
This commit is contained in:
79
13/Exercise03.c
Normal file
79
13/Exercise03.c
Normal file
@@ -0,0 +1,79 @@
|
||||
#include <stdio.h>
|
||||
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user