分数加减法
编写一个C程序,实现两个分数的加减法
Input
Output
Sample Input
Sample Output
输入包含多行数据
每行数据是一个字符串,格式是"a/boc/d"。
其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。
数据以EOF结束
输入数据保证合法
每行数据是一个字符串,格式是"a/boc/d"。
其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。
数据以EOF结束
输入数据保证合法
对于输入数据的每一行输出两个分数的运算结果。
注意结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数
注意结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数
1/8+3/8
1/4-1/2
1/3-1/3
1/2
-1/4
0
通过这道题来总结下分数的加减乘除四则运算:
详情见代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int gcd(int a,int b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
struct Fraction///结构体表示一个分数
{
int up; ///分子
int down;///分母
};
Fraction reduction(Fraction result)///分数化简
{
if(result.down<0)///使分母为非负数,如果分数为负,使分子为负
{
result.up=-result.up;
result.down=-result.down;
}
if(result.up==0)///如果分数为0,规定其分子为0,分母为 1
{
result.down=1;
}
else ///化成最简分数
{
int d=gcd(abs(result.up),abs(result.down));
result.up/=d;
result.down/=d;
}
return result;
}
Fraction add(Fraction f1,Fraction f2)///分数的加法
{
Fraction result;
result.up=f1.up*f2.down+f1.down*f2.up;
result.down=f1.down*f2.down;
return reduction(result);
}
Fraction minu(Fraction f1,Fraction f2)///分数的减法
{
Fraction result;
result.up=f1.up*f2.down-f1.down*f2.up;
result.down=f1.down*f2.down;
return reduction(result);
}
Fraction multi(Fraction f1,Fraction f2)///分数的乘法
{
Fraction result;
result.up=f1.up*f2.up;
result.down=f1.down*f2.down;
return reduction(result);
}
Fraction divide(Fraction f1,Fraction f2)///分数的除法
{
Fraction result;
result.up=f1.up*f2.down;
result.down=f1.down*f2.up;
return reduction(result);
}
void showResult(Fraction r)///分数的输出
{
r=reduction(r); ///化简
if(r.down==1) printf("%d\n",r.up);///整数
else if(abs(r.up)>r.down)///若分数为假分数
{
printf("%d %d/%d\n",r.up/r.down,abs(r.up)%r.down,r.down);
}
else
{
printf("%d/%d\n",r.up,r.down);
}
}
int main()
{
char ch;
Fraction f1,f2;
while(scanf("%d/%d%c%d/%d",&f1.up,&f1.down,&ch,&f2.up,&f2.down)!=EOF)
{
if(ch=='+')
{
Fraction result=add(f1,f2);
showResult(result);
}
else
{
Fraction result=minu(f1,f2);
showResult(result);
}
}
return 0;
}