pta N个数求和(20分)

N个数求和

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤≤ 100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

Copy

输出样例1:

3 1/3

Copy

输入样例2:

2
4/3 2/3

Copy

输出样例2:

2

Copy

输入样例3:

3
1/3 -1/6 1/8

Copy

输出样例3:

7/24

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long sumb=0,suma=0;
	int n=0;
	cin>>n;
	while(n--)
	{
		int a,b;
		scanf("%d/%d",&a,&b);//scanf性质,可以直接读掉“/”不影响结果 
		if(sumb==0) //第一次运算,也可以不设这步,将sumb初值设为1即可 
		{
			sumb+=b;suma+=a;
			int c=__gcd(abs(suma),abs(sumb));
			suma/=c;sumb/=c; //这里也要约分,防n=1且分数需要约分的情况 
		}
		else
		{
			suma=suma*b+a*sumb;//一定要先处理分子再处理分母,分子处理要用到分母,提前处理分母,分子值就会出错 (我卡了好久\\哭) 
			sumb*=b;//这两步就是两个分数的通分相加 
			int c=__gcd(abs(suma),abs(sumb));//__gdc为c++stl函数内容,取最大公约数,记得加绝对值,不然出负数后面不好处理 
			suma/=c;sumb/=c; //每加一个数都约分一次,这样可以不用考虑分母相同以及分母通分值超范围的问题 
		}
	}
	if(sumb==0) 
	{
		cout<<"0";
		return 0;
	}
	if(suma%sumb==0) cout<<suma/sumb;//没有余数,即只含整数(整数部分为“0”也算在内) 
	else if(suma/sumb) cout<<suma/sumb<<" "<<abs(suma%sumb)<<"/"<<sumb;//输出完整数部分分数部分分子要取绝对值 
	else cout<<suma<<"/"<<sumb;
	return 0;
 } 

### PTA 编程题 N个数求和实现方法 为了完成此任务,可以按照以下逻辑来设计程序: #### 1. 数据输入处理 程序应能够接收一组数作为输入。每个数由子和母组成,需将其解析并存储以便后续计算。 #### 2. 数加法运算 对于两个数 \( \frac{a}{b} \) 和 \( \frac{c}{d} \),其加法规则是: \[ \text{新子} = a \times d + c \times b \] \[ \text{新母} = b \times d \] 每次相加后,需要调用约函数以确保结果是最简形式[^3]。 #### 3. 约算法 通过辗转相除法(欧几里得算法),找到当前子和母的最大公约数 (GCD),然后别除以 GCD 来简化数。 以下是完整的 Python 实现代码示例: ```python from math import gcd def simplify(numerator, denominator): """ 将数化为最简形式 """ common_divisor = gcd(abs(numerator), abs(denominator)) simplified_numerator = numerator // common_divisor simplified_denominator = denominator // common_divisor # 如果母为负,则调整到子上 if simplified_denominator < 0: simplified_numerator *= -1 simplified_denominator *= -1 return simplified_numerator, simplified_denominator def add_fractions(fraction_list): """ 计算多个数的和 """ sum_numerator = 0 sum_denominator = 1 for fraction in fraction_list: current_numerator, current_denominator = map(int, fraction.split('/')) # 更新总和的新子和新母 new_numerator = sum_numerator * current_denominator + current_numerator * sum_denominator new_denominator = sum_denominator * current_denominator # 调用约函数 sum_numerator, sum_denominator = simplify(new_numerator, new_denominator) return f"{sum_numerator}/{sum_denominator}" # 主程序部 if __name__ == "__main__": n = int(input()) # 输入数的数量 fractions = [] for _ in range(n): fractions.append(input().strip()) result = add_fractions(fractions) print(result) ``` 上述代码实现了如下功能: - **simplify 函数**:用于将任意给定的数转换为其最简形式。 - **add_fractions 函数**:逐个累加数组成的结果,并在每一步都执行一次约化简操作。 #### 输出说明 最终输出是一个字符串表示的数,形如 `numerator/denominator`,其中子和母均为整数且互质。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值