PTA之N个数求和(细节题)天梯赛

简介: 编程题,要求计算以分子/分母形式给出的一组有理数的和,输出结果也要是最简有理数形式。输入包含正整数N(N≤100)及N个有理数,输出为和的最简形式。示例:输入5个数2/5, 4/15, 1/30, -2/60, 8/3,输出3 1/3;输入2个数4/3, 2/3,输出2。代码中包含求最大公约数的函数和计算有理数和的主要逻辑。

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

输入格式:

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

输出格式:

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

输入样例1:

5

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

输出样例1:

3 1/3

输入样例2:

2

4/3 2/3

输出样例2:

2

输入样例3:

3

1/3 1/6 1/8

输出样例3:

7/24

#include

long long  zui(long long a,long long b)

{

   /*if(a%b!=0)return zui(b,a%b);

   else

       return b; */

  /* long long n;

 

 while(b!=0)

 {

   n=a%b;

   a=b;

   b=n;

 }

 return a;*///这是一种利用辗转相除法求最大公约数的方法(可用)

   if(b!=0)return zui(b,a%b); //这是一种递归求公约数的方法,其基本原理也是利用辗转相除法(可用)

}

int main()

{

 long  long a[150],c[150];

 long  long b,d,c1,c2,sum1=0,sum2=0,k=0,h=0;

 char ch;

 scanf("%lld",&b);//规定的分数的个数

 for(int i=0;i<b;i++)

 {

   scanf("%lld%c%lld",&a[i],&ch,&c[i]);//此处也可写为scanf("%lld/%lld",&a[i],&c[i]);

   

 }

 sum2=c[0];

 for(int i=1;i<b;i++)

 {

   k=sum2*c[i];

   sum2=k/zui(sum2,c[i]);//此处是求各个分数的公分母,为了不使值超出long long的范围,每两项求一下最小公倍数;---北冥注释

 }

 for(int m=0;m<b;m++) { sum1=sum1+a[m]*(sum2/c[m]);//求各个分子的和;(sum2/c[m])必须加括号因为如果先算a[m]*sum2会导致数可能超出 } // long long 的范围; 当然也可写成sum2/c[m]*a[m]的形式,此处只是提醒一下 d=zui(sum1,sum2); // 这个细节,因为这个坑很难发现---北冥注释QQ80374779 c1=sum1/d; c2=sum2/d; if(c1%c2==0)printf("%lld",c1/c2);//因为如果有整数部分时负号总是出现在整数部分,所以此处不必考虑负号的有无 if(c1%c2!=0) { if(c1/c2!=0)printf("%lld ",c1/c2); if(c2>=0)printf("%lld/%lld",c1%c2,c2);//如果分子中没有负数

   if(c2<0)                             //如果分子中有负数,把负数变为正数

   {                                    

     c2=-c2;                          

     if(c1/c2==0)printf("-");     //如果此分母没有整数部分,那么此时负号必须移动到分子前面;

     printf("%lld/%lld",c1%c2,c2);

   }  

 }

 return 0;

}

目录
相关文章
|
算法 C++ 索引
【C++STL基础入门】深入浅出string类查找字串、返回字串和交换操作
【C++STL基础入门】深入浅出string类查找字串、返回字串和交换操作
1336 1
|
机器学习/深度学习 数据采集 算法
Python中的支持向量机(SVM)以及如何使用Sklearn库实现它
SVM是监督学习算法,用于分类和回归,Python中可通过Scikit-learn实现。步骤包括数据预处理、选择SVM模型(如线性或非线性,配合核函数)、训练模型找到最优超平面、模型评估、参数调整和新数据预测。Scikit-learn简化了这一流程,便于数据分析任务。
735 3
|
8月前
|
人工智能 前端开发 JavaScript
2025年主流Web自动化测试工具功能与性能深度对比
2025年主流Web自动化测试工具在功能、性能等方面差异显著。功能上,不同工具在元素定位、脚本兼容性等核心模块各有优劣;性能方面,执行效率与资源占用需平衡,分布式执行能力对高并发场景很重要。还介绍了智能化与生态扩展趋势,给出企业选型建议及不同规模团队适用方案。
|
C++
【PTA】​ L1-009 N个数求和​ (C++)
【PTA】​ L1-009 N个数求和​ (C++)
961 0
【PTA】​ L1-009 N个数求和​ (C++)
|
弹性计算 安全 网络安全
阿里云国际版无法远程连接Windows服务器的解决方法
阿里云国际版无法远程连接Windows服务器的解决方法
|
前端开发 安全 开发者
【通义灵码实践】实现经典手机游戏推箱子
本文介绍了使用通义灵码辅助实现经典推箱子游戏的过程。首先,通过输入“用Python写一个推箱子游戏”,灵码生成了基本的终端版本代码,包括地图渲染、玩家移动和胜利检测等功能。然而,终端版本交互体验不佳。为了解决这一问题,再次输入“不要在终端上运行,希望可以在页面上运行”,灵码生成了基于Flask的后端代码和HTML前端代码,实现了网页版推箱子游戏。最终结果展示了游戏的完整实现,包括前后端交互和用户界面。总结中提到,该方法具有快速生成代码、代码质量高、易于扩展等优点,但也存在功能简单、样式和用户体验有限、错误处理不足等问题,适合快速原型开发和教学演示。
759 2
|
机器学习/深度学习 自然语言处理 算法
视频字幕自动生成
8月更文挑战第12天
1112 2
|
网络协议 安全 网络安全
图解OSI七层模型,2024最强科普!
【7月更文挑战第20天】
4621 2
图解OSI七层模型,2024最强科普!
|
算法 C语言
(“拨”取数字的典例:N位水仙花数判断及水仙花数变种)
这篇内容介绍了如何判断和生成水仙花数,水仙花数是一个n位数,其各位数字的n次方之和等于该数本身。文章首先回顾了"拨数"的概念,然后通过实例展示了如何判断三位水仙花数,并将其推广到任意位数的水仙花数。作者提供了详细的解题思路和代码示例,强调了解决这类问题时要慢下来,分步骤分析问题。最后,文章还探讨了一个水仙花数的变种问题,即数字拆分后乘积之和等于原数的情况。
1393 0
|
机器学习/深度学习 人工智能 数据可视化
号称能打败MLP的KAN到底行不行?数学核心原理全面解析
Kolmogorov-Arnold Networks (KANs) 是一种新型神经网络架构,挑战了多层感知器(mlp)的基础,通过在权重而非节点上使用可学习的激活函数(如b样条),提高了准确性和可解释性。KANs利用Kolmogorov-Arnold表示定理,将复杂函数分解为简单函数的组合,简化了神经网络的近似过程。与mlp相比,KAN在参数量较少的情况下能达到类似或更好的性能,并能直观地可视化,增强了模型的可解释性。尽管仍需更多研究验证其优势,KAN为深度学习领域带来了新的思路。
7491 5