3209. 分数加法

单点时限: 2.0 sec

内存限制: 256 MB

输入格式
第一行是一个整数 n (1≤n≤1000),表示分数的个数。

接下来 n 行,每行一个分数。

一个分数可以唯一地用上下文无关文法表示:

F ::= 0 | N | -N | N/P | -N/P
其中 N 是一个不带前导零的正整数,P 是一个大于等于 2 的正整数。

所有整数的绝对值不超过 109。

输出格式
输出所有分数的和。格式同上。

样例
input
2
1/2
2/3
output
7/6
input
3
1/2
-2/3
0
output
-1/6
input
2
-1
1
output
0

/*
C++处理。
*/
#include<iostream>
#include<algorithm>
using namespace std;
struct g {
	long long a,b;
};
int main() {
	int n;
	cin>>n;
	g G[n];
	for(int i = 0; i < n; i++) {
		string s;
		cin>>s;
		int index=0;
		if(s.find('/')!=string::npos)
			index=s.find('/');
		int a,b;
		if(index==0)
			a=stoi(s),b=1;
		else
			a=stoi(s.substr(0,index)),b=stoi(s.substr(index+1,s.size()-index-1));
		G[i].a=a;
		G[i].b=b;
	}
	long long x=G[0].a;
	long long y=G[0].b;
	long long gcd=__gcd(x,y);
	x/=gcd;
	y/=gcd;
	for(int i =1; i < n; i++) {
		x=x*G[i].b+y*G[i].a;
		y*=G[i].b;
		long long gcd=__gcd(x,y);
		x/=gcd;
		y/=gcd;
	}
	if(y<0) {
			y=-y;
			x=-x;
		}
	if(y==1)
		cout<<x<<endl;
	else
		cout<<x<<"/"<<y<<endl;
	return 0;
}
#Fraction处理分数
from fractions import Fraction
n=int(input())
a=0
for i in range(n):
    a+=Fraction(input())
print(a)

下面介绍python中fractions库下面的Fraction类处理分数

Python——处理分数类Fraction

 

Python标准库fractions中Fraction类可以帮助我们处理分数。

 

1. 导入

from fractions import Fraction

 


2. 实例化

Fraction类有多种实例化方法:

1.传入分子和分母
>>> Fraction(4, 3)
Fraction(4, 3)
2.传入浮点数
>>> Fraction(3.5)
Fraction(7, 2)
3.传入字符串
>>>Fraction('5/6')
Fraction(5, 6)
4. 用另一个Fraction示例进行初始化
>>> a = Fraction(2,4)
>>> b = Fraction(a)
>>> b
Fraction(1, 2)
5. 或者使用一个Decimal实例
>>> from decimal import Decimal
>>> x = Decimal("1.1")
>>> y = Fraction(x)
>>> y
Fraction(11, 10)
 
 

 


3. 特性

1. 自动约分 

Fraction类能够自动对分子和分母进行约分,当分子分母中有负号时,自动约分并最终将负号归于分子

>>>Fraction(10, -5)
Fraction(-2, 1)
2. 二元运算: 

1) 加法 + 


i)两个分数相加得到一个分数:

>>> Fraction(1,3) + Fraction(1,6)
Fraction(1, 2)

ii)一个分数加一个整数得到一个分数:

>>> Fraction(1,2) + 1
Fraction(3, 2)

iii)一个分数加一个浮点数得到一个浮点数:

>>> Fraction(1,2) + 1.6
2.1

2) 减法 - 、乘法 * 、除法 / 同加法

复制代码
>>> Fraction(3,2) - Fraction(1,2)    #分数减法
Fraction(1, 1)
>>> Fraction(3,2) - 1
Fraction(1, 2)
>>> Fraction(3,2) - 0.5
1.0
>>> Fraction(1,2) * Fraction(1,3)    #分数乘法
Fraction(1, 6)
>>> Fraction(1,2) * 3
Fraction(3, 2)
>>> Fraction(1,2) * 0.5
0.25
>>> Fraction(3,2) / Fraction(3,1)    #分数除法
Fraction(1, 2)
>>> Fraction(3,2) / 3
Fraction(1, 2)
>>> Fraction(3,2) / 3.0
0.5
复制代码

3) 乘方 ** :

复制代码
>>> Fraction(1,4)**Fraction(1,2)
0.5
>>> Fraction(1,4)**2
Fraction(1, 16)
>>> Fraction(1,4)**0.5
0.5
>>> 0.25**Fraction(1,2)
0.5
>>> 4**Fraction(1,2)
2.0
复制代码

我们发现,乘方运算含有Fraction对象时,若Fraction对象位于指数位,则结果返回一个浮点数;当Fraction对象位于底数位时,只有指数是整数时,返回结果才是一个Fraction对象,否则返回结果都是浮点数。

4) 合理计算

我们知道浮点数有精度要求,是因为浮点数有舍入误差,如:

>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> Fraction("1.1")
Fraction(11, 10)

上述代码中,由str对象实例化可以得到精确表示,但是由浮点数表示不能得到精确表示,这是由浮点数的特性决定的。实际上我们可以使用Fraction对象的limit_denominator()方法得到一个近似的Fraction值。

>>> f = Fraction(1.1)
>>> f
Fraction(2476979795053773, 2251799813685248)
>>> f.limit_denominator()
Fraction(11, 10)

 


4. 获取Fraction对象属性

  • .numerator:获取分子
  • .denominator:获取分母

>>> f = Fraction(1,2)
>>> f.numerator
1
>>> f.denominator
2

 


5. .__str__()和.__repr__()方法:

Fraction对象作为一个字符串,使用print()函数打印整个分数:

复制代码
>>> f = Fraction(1,2)
>>> print(f)
1/2
>>> f.__str__()
'1/2'
>>> str(f)
'1/2'
>>> f.__repr__()
'Fraction(1, 2)'
>>> repr(f)
'Fraction(1, 2)'
复制代码

 


6.gcd:求最大公约数函数

>>> import fractions
>>> fractions.gcd(2,4)
2

 


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值