设计并实现一个分数类Fraction

描述

一个分数有两部分组成——分子和分母,如5/6

为Fraction类定义实现赋值、加、减、乘、除以及相等判定的运算符,

并定义转换至double型值的函数(保留小数点后六位)

输入

输入一个分数计算表达式,分数用a/b表示,计算符只有+,-,*,/
表达式比较简单,只有 A operator B,其中A和B是分数,operator是计算符

输出

输出计算结果,分别用分数和小数的形式表示: 形如 分数(小数)

样例输入

5/6 + 3/4

样例输出

19/12(1.583333)

提示

1. 分数表达式必须是最简,该约分约分,不要用带分数
2. 小数表达时,如果小数点后不足六位,则需要对应补零
3. 例如对于 5/6 * 3/4, 输出 5/8(0.625000)

这个题目最有意思的是输入,一开始我这样写的

scanf("%d/%d%c%d/%d",&a,&b,&ch,&c,&d);

就错了,找错找了半个点,后来改成

scanf("%d/%d %c %d/%d",&a,&b,&ch,&c,&d);


这样就对了,这两行区别就是%c左右两边各有一个空格,至于为什么很好理解,这个题目用cin不太方便,我们平时使用的cin是靠手动输入空格来分割不同的元素,而scanf在这种使用情况下需要我们自己添加空格来区分

这个题目后台数据有水,过了不一定对,需要注意的地方就是当一个小的数减大的数的时候需要在前面加负号

#include <iostream>
#include <cstdio>
#include <iomanip>
#include <cmath>
using namespace std;
int gys(int x,int y)
{
    if(x<y) swap(x,y);
    int a=x;
    int b=y;
    if(a%b==0)
    {
        return b;
    }
    else{
        int temp=a;
        a=b;
        b=temp%b;
        return gys(a,b);
    }
}
int gbs(int x,int y)
{
    return x*y/gys(x,y);
}
class Faction{
    int up,down;
public:
    Faction operator +(Faction);
    Faction operator -(Faction);
    Faction operator *(Faction);
    Faction operator /(Faction);
    Faction(int x=1,int y=1):up(x),down(y){}
    double change_type();
    void print();
};
Faction Faction::operator +(Faction x){
    Faction c;
    c.down=gbs(down,x.down);
    c.up=c.down/down*up+c.down/x.down*x.up;
    int GYS=gys(c.up,c.down);
    c.up=c.up/GYS;
    c.down=c.down/GYS;
    return c;
}
Faction Faction::operator -(Faction x){
    Faction c;
    c.down=gbs(down,x.down);
    c.up=c.down/down*up-c.down/x.down*x.up;
    int GYS=gys(c.up,c.down);
    c.up=c.up/GYS;
    c.down=c.down/GYS;
    return c;
}
Faction Faction::operator *(Faction x){
    Faction c;
    c.down=down*x.down;
    c.up=up*x.up;
    int GYS=gys(c.up,c.down);
    c.up=c.up/GYS;
    c.down=c.down/GYS;
    return c;
}
Faction Faction::operator /(Faction x){
    int temp=x.up;
    x.up=x.down;
    x.down=temp;
    Faction c;
    c.down=down*x.down;
    c.up=up*x.up;
    int GYS=gys(c.up,c.down);
    c.up=c.up/GYS;
    c.down=c.down/GYS;
    return c;
}
double Faction::change_type()
{
    return up*1.0/down;
}
void Faction::print()
{
    if(down<0)
        cout<<"-"<<up<<"/"<<fabs(down);
    else cout<<up<<"/"<<down;
}
int main()
{
    int a,b,c,d;
    char ch;
    scanf("%d/%d %c %d/%d",&a,&b,&ch,&c,&d);
    Faction A(a,b);
    Faction B(c,d);
    Faction temp;
    switch(ch)
    {
        case '+':{
            temp=A+B;
            break;
        }
        case '-':{
            temp=A-B;
            break;
        }
        case '*':{
            temp=A*B;
            break;
        }
        case '/':{
            temp=A/B;
            break;
        }
    }
    temp.print();
    cout<<"("<<fixed<<setprecision(6)<<temp.change_type()<<")"<<endl;
    return 0;
}

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值