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 有理数类型题处理 需再做的主要内容,如果未能解决你的问题,请参考以下文章

1081 Rational Sum (20 分)分数加法

1081 Rational Sum (20)

PAT 1081. Rational Sum

1081 Rational Sum(20 分)

1081. Rational Sum (20) -最大公约数

1081. Rational Sum (20)模拟——PAT (Advanced Level) Practise