【1081】Rational Sum (20 分)
【摘要】
#include<iostream>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<algorithm> #include<map>#inclu...
-
#include<iostream>
-
#include<stdio.h>
-
#include<stdlib.h>
-
#include<math.h>
-
#include<string.h>
-
#include<algorithm>
-
#include<map>
-
#include<vector>
-
#include<queue>
-
using namespace std;
-
typedef long long ll; //记ll为long long
-
ll gcd(ll a,ll b){ //求a与b的最大公约数
-
return b==0?a:gcd(b,a%b);
-
}
-
struct Fraction{ //分数
-
ll up,down; //分子,分母
-
};
-
Fraction reduction(Fraction result){ //化简
-
if(result.down <0) { //分母为负数,令分子和分母都变为相反数
-
result.up=-result.up;
-
result.down=-result.down;
-
}
-
if(result.up == 0){ //如果分子为0
-
result.down=1; //令分母为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){ //分数f1加上分数f2
-
Fraction result;
-
result.up=f1.up*f2.down+f2.up*f1.down; //分数和的分子
-
result.down=f1.down *f2.down; //分数和的分母
-
return reduction(result); //返回结果分数,注意化简
-
}
-
void showResult(Fraction r){ //输出分数r
-
reduction(r);
-
if(r.down == 1) printf("%lld",r.up); //整数
-
else if(abs(r.up) > r.down){ //假分数
-
printf("%lld %lld/%lld\n",r.up / r.down, abs(r.up)%r.down , r.down);
-
}else{ //真分数
-
printf("%lld/%lld\n",r.up,r.down);
-
}
-
}
-
-
int main(){
-
int n; //分数个数
-
scanf("%d",&n); //分数个数
-
Fraction sum,temp;
-
sum.up=0;sum.down=1 ;//初值:和的分子为0,分母为1!!!
-
for(int i=0;i<n;i++){
-
scanf("%lld/%lld",&temp.up,&temp.down);
-
sum=add(sum,temp); //sum增加temp
-
}
-
showResult(sum); //输出结果
-
system("pause");
-
return 0;
-
}
文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。
原文链接:andyguo.blog.csdn.net/article/details/99355395
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)