A1088 Rational Arithmetic (20分)
一、技术总结
- 关键点就一个最大公约数函数,一个化简函数,在加一个输出函数;
- 对于化简函数,首先如果分数为负数,那么得保证分子是负数,为了输出要求;在一个就是化简,如果分子等于0,那么要将分母赋值为1,如果不为零那么就要进行约分,即使用gcd函数找到最大公约数即可
- 再就是输出函数,这个要按照题目的具体要求进行输出:
- 一般就是如果有负数在最前和最后加上括号;
- 如果为整数那么直接输出分子即可;
- 如果分子大于分母要输出假分式;
- 如果本身是真分式,则输出真分式;
二、参考代码
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b){
return !b ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b){
return a * gcd(a, b) / b;
}
struct Fraction{
ll up, down;
}a, b;
Fraction reduction(Fraction result){
if(result.down < 0){//保证分子是负数
result.up = -result.up;
result.down = -result.down;
}
if(result.up == 0){
result.down = 1;
}else{//如果分子不为0,进行约分
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.up < 0) printf("(");
if(r.down == 1) printf("%lld", r.up);
else if(abs(r.up) > r.down){
printf("%lld %lld/%lld", r.up / r.down, abs(r.up) % r.down, r.down);
}else{
printf("%lld/%lld", r.up, r.down);
}
if(r.up < 0) printf(")");
}
int main(){
scanf("%lld/%lld %lld/%lld", &a.up, &a.down, &b.up, &b.down);
showResult(a);
printf(" + ");
showResult(b);
printf(" = ");
showResult(add(a, b));
printf("\n");
showResult(a);
printf(" - ");
showResult(b);
printf(" = ");
showResult(minu(a, b));
printf("\n");
showResult(a);
printf(" * ");
showResult(b);
printf(" = ");
showResult(multi(a, b));
printf("\n");
showResult(a);
printf(" / ");
showResult(b);
printf(" = ");
if(b.up == 0) printf("Inf");
else showResult(divide(a, b));
return 0;
}
作者:睿晞
身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
曾有一个业界大牛说过这样一段话,送给大家:
“华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.