解题思路:分数的加法与分数的输出,注意要用long long运算,int相乘可能溢出。
分数的化简:1.如果分母为负数,则分子分母同取相反数,目的是去掉分母上的负号。
2.如果分子为0,则分母改为1,目的是方便输出结果的时候进行判定。
3.分子分母化为最简分数,即找最小公约数化简。
分数的相加:按照手算的过程相加。
分数的输出:1.化简后分母为1,则直接输出分子。
2.分子绝对值>分母,带分数形式输出。
3.分子绝对值<分母,直接输出。
代码如下:
#include<bits/stdc++.h>
#define lowbit(x) ((x)&(-(x)))
#define ll long long
#define INF 0x3f3f3f3f
#define N 100000
#define CLR(a) memset(a, 0, sizeof(a))
using namespace std;
ll gcd(ll a,ll b){
return !b?a:gcd(b,a%b);
}
struct node{
ll up,down;
};
node reduction(node result){//化简函数
if(result.down<0){
result.down=-result.down;
result.up=-result.up;
}
if(result.up==0){
result.down=1;
}
else{
int d=gcd(abs(result.up),abs(result.down));
result.up/=d;
result.down/=d;
}
return result;
}
node add(node f1,node f2){//分数相加函数
node result;
result.down=f1.down*f2.down;
result.up=f1.up*f2.down+f2.up*f1.down;
return reduction(result);
}
void showresult(node result){//分数输出函数
if(result.down==1){
printf("%lld\n",result.up);
}
else{
if(abs(result.up)>result.down){
printf("%lld %lld/%lld\n",result.up/result.down,abs(result.up)%result.down,result.down);
}
else{
printf("%lld/%lld\n",result.up,result.down);
}
}
}
int n;
int main() {
cin>>n;
node tmp,ans;
scanf("%lld/%lld",&ans.up,&ans.down);
reduction(ans);
for(int i=1;i<n;i++){
scanf("%lld/%lld",&tmp.up,&tmp.down);
tmp=reduction(tmp);
ans=add(ans,tmp);
}
showresult(ans);
return 0;
}
本文介绍了一种使用C++实现的分数运算方法,包括分数的加法、化简及输出。通过寻找最小公约数来简化分数,并实现了分数相加的功能。最后,文章详细描述了如何根据不同的情况正确输出分数。
1492

被折叠的 条评论
为什么被折叠?



