描述
一个分数有两部分组成——分子和分母,如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;
}