struct fraction { //numerator=分子 denominator=分母 int numerator; int denominator; }; int gcd(int a, int b) { //最大公約 if (b == 0) return a; return gcd(b, a%b); } struct fraction reduce(struct fraction x){//約分 int w = gcd(x.numerator, x.denominator); x.numerator /= w; x.denominator /= w; return x; } #include struct fraction inputFraction() { //分数の読み込み struct fraction a; printf("numerator? > "); scanf("%d", &a.numerator); printf("denominator? > "); scanf("%d", &a.denominator); return a; } void printFraction(struct fraction a) {//分数の出力 if (a.numerator % a.denominator ==0){ printf("%d\n", a.numerator / a.denominator); } else{ printf("%d / %d\n", a.numerator, a.denominator); } } struct fraction add(struct fraction x, struct fraction y) {//分数の足し算 struct fraction z; int w = gcd(x.denominator, y.denominator); z.denominator = (x.denominator / w)*y.denominator; z.numerator = x.numerator*(y.denominator / w) + y.numerator*(x.denominator / w); z = reduce(z); return z; } struct fraction subt(struct fraction x,struct fraction y ) { struct fraction z; int w = gcd(x.denominator, y.denominator); z.denominator = (x.denominator / w)*y.denominator; z.numerator = x.numerator*(y.denominator / w) - y.numerator*(x.denominator / w); z = reduce(z); return z; } struct fraction mult(struct fraction x,struct fraction y ) { struct fraction z; z.denominator =x.denominator*y.denominator; z.numerator = x.numerator*y.numerator; z = reduce(z); return z; } struct fraction div(struct fraction x,struct fraction y ) { struct fraction z; z.denominator = x.denominator*y.numerator; z.numerator = x.numerator*y.denominator; z = reduce(z); return z; } int main() { struct fraction a, b, c, d, e, f; a = inputFraction(); b = inputFraction(); c = add(a, b); d = subt(a, b); e = mult(a, b); f = div(a, b); printf("fraction a+b\n"); printFraction(c); printf("fraction a-b\n"); printFraction( d ); printf("fraction a*b\n"); printFraction( e ); printf("fraction a/b\n"); printFraction( f ); }