题目大意:
给定2个分数,求出这2个分数的四则运算结果。若为假分数,得按照带分数的方式进行输出,整数按照整数的形式输出,否则按照真分数进行输出。
算法思路:此题和1081思路是一样的,不过需要写出四则运算,具体步骤如下:
1.分数采用Fraction结构体存储,这里要求数据得是long long型
2.gcd函数求解两数的最大公约数,目的是为了后面的化简操作
3.分数的化简:满足2个原则
1)如果分母为负数,令分子和分母都变为相反数,保证负号在分子上。
2)约分:求出分子绝对值和分母的最大公约数d,然后让分子和分母同时除以d
4.分别使用add,sub,multi,div计算f1和f2的加减乘除,按照数学公式来就行,最后返回化简的结果,这里得注意如果b的分子为0,得将返回结果的分母设置为0,表示无穷大。
5.分数的输出规则:
1)如果分母为1,说明该分数为整数,输出分子即可
2)如果分母为0,说明是无穷大,输出Inf
3)如果分子的绝对值大于分母,说明是假分数,此时按照带分数的格式输出,即先输出 整数部分(分子除以分母),
分子(分子绝对值对分母求余数)/分母,这里得注意对于负数需要添加括号
4)否则就是真分数,按照原样输出即可,对于负数得添加括号。
四则运算代码:
// 分数a和分数b的加法
Fraction add(Fraction a,Fraction b){
Fraction r;
r.denominator = a.denominator*b.denominator;
r.numerator = a.denominator*b.numerator+a.numerator*b.denominator;
return reduction(r);// 返回化简的结果
}
// 分数a和分数b的减法
Fraction sub(Fraction a,Fraction b){
Fraction r;
r.denominator = a.denominator*b.denominator;
r.numerator = a.numerator*b.denominator-a.denominator*b.numerator;
return reduction(r);// 返回化简的结果
}
// 分数a和分数b的乘法
Fraction multi(Fraction a,Fraction b){
Fraction r;
r.denominator = a.denominator*b.denominator;
r.numerator = a.numerator*b.numerator;
return reduction(r);// 返回化简的结果
}
// 分数a和分数b的除法
Fraction div(Fraction a,Fraction b){
Fraction r;
if(b.numerator==0){
// 除数为0
r.numerator = 0;
r.denominator = 0;
return r;
}
r.denominator = a.denominator*b.numerator;
r.numerator = a.numerator*b.denominator;
return reduction(r);// 返回化简的结果
}
提交结果:
AC代码:
#include <cstdio>
#include <algorithm>
using namespace std;
struct Fraction{
long long numerator;// 分子
long long denominator;// 分母
// 默认分数为0
Fraction(){
numerator = 0;
denominator = 1;
}
};
// 求a和b的最大公约数
long long gcd(long long a,long long b){
if(b==0) return a;
else return gcd(b,a%b);
}
// 分数的化简
Fraction reduction(Fraction f){
if(f.denominator<0) {
// 分母为负数,将分母和分子都取反
f.numerator = -f.numerator;
f.denominator = -f.denominator;
}
// 获得分子分母的最大公约数
long long d = gcd(abs(f.numerator),f.denominator);
// 约分
f.denominator /= d;
f.numerator /= d;
return f;
}
// 分数a和分数b的加法
Fraction add(Fraction a,Fraction b){
Fraction r;
r.denominator = a.denominator*b.denominator;
r.numerator = a.denominator*b.numerator+a.numerator*b.denominator;
return reduction(r);// 返回化简的结果
}
// 分数a和分数b的减法
Fraction sub(Fraction a,Fraction b){
Fraction r;
r.denominator = a.denominator*b.denominator;
r.numerator = a.numerator*b.denominator-a.denominator*b.numerator;
return reduction(r);// 返回化简的结果
}
// 分数a和分数b的乘法
Fraction multi(Fraction a,Fraction b){
Fraction r;
r.denominator = a.denominator*b.denominator;
r.numerator = a.numerator*b.numerator;
return reduction(r);// 返回化简的结果
}
// 分数a和分数b的除法
Fraction div(Fraction a,Fraction b){
Fraction r;
if(b.numerator==0){
// 除数为0
r.numerator = 0;
r.denominator = 0;
return r;
}
r.denominator = a.denominator*b.numerator;
r.numerator = a.numerator*b.denominator;
return reduction(r);// 返回化简的结果
}
// 分数的输出
void print(Fraction f){
if(f.denominator==1){
// 整数,输出分子即可
if(f.numerator>=0){
printf("%lld",f.numerator);
} else {
printf("(%lld)",f.numerator);
}
} else if(f.denominator==0){
// 无穷大
printf("Inf");
} else {
if(abs(f.numerator)>f.denominator){
// 假分数
if(f.numerator>=0){
printf("%lld %lld/%lld",f.numerator/f.denominator,abs(f.numerator)%f.denominator,f.denominator);
} else {
printf("(%lld %lld/%lld)",f.numerator/f.denominator,abs(f.numerator)%f.denominator,f.denominator);
}
} else {
// 真分数
if(f.numerator>=0){
printf("%lld/%lld",f.numerator,f.denominator);
} else {
printf("(%lld/%lld)",f.numerator,f.denominator);
}
}
}
}
// 输出a与b的四则运算
void printAll(Fraction a,Fraction b){
for (int num = 0; num < 4; ++num) {//0代表加法,1代表减法,2代表乘法,3代表除法
print(a);
switch (num){
case 0:printf(" + ");
break;
case 1:printf(" - ");
break;
case 2:printf(" * ");
break;
case 3:printf(" / ");
break;
default:
break;
}
print(b);
printf(" = ");
switch (num){
case 0:print(add(a,b));
break;
case 1:print(sub(a,b));
break;
case 2:print(multi(a,b));
break;
case 3:print(div(a,b));
break;
default:
break;
}
printf("\n");
}
}
int main(){
Fraction a,b;
scanf("%lld/%lld %lld/%lld",&a.numerator,&a.denominator,&b.numerator,&b.denominator);
printAll(reduction(a),reduction(b));
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。