1081 Rational Sum 有理数类型题处理 需再做
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1081 Rational Sum 有理数类型题处理 需再做相关的知识,希望对你有一定的参考价值。
一、有理数结构体的几个约束
struct fraction{
LL up,down;
fraction(LL _up,LL _down):up(_up),down(_down){}
};
(1)如果这个有理数是0,则让分子为0,分母为1(这方便后来输出时归于整数一类)
(2)如果这个有理数是负数,则把符号给分子,分母保持为一个整数
二、化简函数要做的事
fraction reduction(fraction f){
LL factor = gcd(abs(f.up),f.down);
f.up /= factor;
f.down /= factor;
if(f.up==0)f.down = 1;
return f;
}
(1)要是分母为负的,分子分母都取相反数
(2)要是分子为0,分母设置为1(这方便后来输出时归于整数一类)
(3)分子分母同除以最大公约数
三、输出函数的原则
void print(fraction f){
f = reduction(f);
if(f.down==1){
printf("%lld",f.up);//整数
}else if(abs(f.up)>f.down){
printf("%lld %lld/%lld",f.up/f.down,abs(f.up)%f.down,f.down);
}else{
printf("%lld/%lld",f.up,f.down);
}
}
在化简之后分为整数、假分数和真分数输出。
其中假分数需要特别考虑有理数为负数的情况。让前面那个整数来承担符号,后面的分数不用(所以后面的分子加绝对值后再对分母取余)
四、即时化简
最后最后,在加法后面要记得返回化简后的值。
AC代码
#include<cstdio>
#include<iostream>
#include<set>
#include<vector>
#include<map>
#include<algorithm>
#include<cmath>
#include<queue>
#include<string>
using namespace std;
const int maxn = 1001;
typedef long long LL;
LL gcd(LL a,LL b){
return b==0?a:gcd(b,a%b);
}
struct fraction{
LL up,down;
fraction(LL _up,LL _down):up(_up),down(_down){}
};
fraction reduction(fraction f){
LL factor = gcd(abs(f.up),f.down);
f.up /= factor;
f.down /= factor;
if(f.up==0)f.down = 1;
return f;
}
fraction Add(fraction a,fraction b){
fraction c(0,1);
c.up = a.up*b.down+a.down*b.up;
c.down = a.down*b.down;
return reduction(c);
}
void print(fraction f){
f = reduction(f);
if(f.down==1){
printf("%lld",f.up);//整数
}else if(abs(f.up)>f.down){
printf("%lld %lld/%lld",f.up/f.down,abs(f.up)%f.down,f.down);
}else{
printf("%lld/%lld",f.up,f.down);
}
}
int main(){
int K;
scanf("%d",&K);
fraction res(0,1),temp(0,1);
for(int i=0;i<K;i++){
string str;
cin>>str;
sscanf(str.c_str(),"%lld/%lld",&temp.up,&temp.down);
if(temp.up!=0)res = Add(res,temp);
}
print(res);
return 0;
}
以上是关于1081 Rational Sum 有理数类型题处理 需再做的主要内容,如果未能解决你的问题,请参考以下文章