题目描述
分数的分子和分母可用一个结构类型来表示。
编写实现两个分数加(addFS),减(subFS),乘(mulFS),除(divFS)的函数(要求计算结果分数是简化的),以及打印一个分数(printFS),计算两个整数最大公约数的函数(getGCD)。
注意:不能定义全局变量
输入
测试数据的组数 t
第一组第一个分数
第一组第二个分数
第二组第一个分数
第二组第二个分数
......
输出
第一组两个分数的和
第一组两个分数的差
第一组两个分数的积
第一组两个分数的商
第二组两个分数的和
第二组两个分数的差
第二组两个分数的积
第二组两个分数的商
......
输入样例
3
1/2
2/3
3/4
5/8
21/23
8/13
输出样例
7/6\n
-1/6\n
1/3\n
3/4\n
\n
11/8\n
1/8\n
15/32\n
6/5\n
\n
457/299\n
89/299\n
168/299\n
273/184\n
提示
求两数a、b的最大公约数可采用辗转相除法,又称欧几里得算法,其步骤为:1. 交换a, b使a > b;2. 用a除b得到余数r,若r=0,则b为最大公约数,退出;3. 若r不为0,则用b代替a, r代替b,此时a,b都比上一次的小,问题规模缩小了;4. 继续第2步。
#include<iostream>
using namespace std;
struct Fraction{
int numerator;//分子
int denominator;//分母
};
int getGCD(int a,int b){
static Fraction res;
int t=a;
if(a < b){
t = a , a = b , b = t;
}
for(;t != 0 ;){
t = a%b;
a = b;
b = t;
//if(t==0)
// break;
}
return abs(a);
}
Fraction &addFS(Fraction &a,Fraction &b){
static Fraction res;
res.denominator = a.denominator*b.denominator;
res.numerator = a.numerator*b.denominator+b.numerator*a.denominator;
int GCD=getGCD(res.denominator,res.numerator);
res.denominator = res.denominator/ GCD;
res.numerator = res.numerator / GCD;
return res;
}
Fraction &subFS(Fraction &a,Fraction &b){
static Fraction res;
res.denominator = a.denominator*b.denominator;
res.numerator = a.numerator*b.denominator-b.numerator*a.denominator;
int GCD = getGCD(res.denominator,res.numerator);
res.denominator = res.denominator/ GCD;
res.numerator = res.numerator / GCD;
return res;
}
Fraction &mulFS(Fraction &a,Fraction &b){
static Fraction res;
res.numerator = a.numerator*b.numerator;
res.denominator = a.denominator*b.denominator;
int GCD = getGCD(res.denominator,res.numerator);
res.numerator /= GCD;
res.denominator /= GCD;
return res;
}
Fraction &divFS(Fraction &a,Fraction &b){
static Fraction res;
res.numerator = a.numerator*b.denominator;
res.denominator = a.denominator*b.numerator;
int GCD= getGCD(res.denominator,res.numerator);
res.numerator /= GCD;
res.denominator /= GCD;
return res;
}
void printFS(Fraction &A){
cout<<A.numerator<<"/"<<A.denominator<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
Fraction a,b;
scanf("%d/%d",&a.numerator,&a.denominator);
scanf("%d/%d",&b.numerator,&b.denominator);
printFS(addFS(a,b));
printFS(subFS(a,b));
printFS(mulFS(a,b));
printFS(divFS(a,b));
if(t > 0)
cout<<"t = "<<t<<endl;
}
return 0;
}