【id:22】【8分】I. 分数四则运算(结构)

题目描述

分数的分子和分母可用一个结构类型来表示。

编写实现两个分数加(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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值