ybt 第二部分 基础算法 --> 第四章 递归算法 1209 分数求和
1209:分数求和
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 4779 通过数: 2682
【题目描述】
输入nn个分数并对他们求和,并用最简形式表示。所谓最简形式是指:分子分母的最大公约数为11;若最终结果的分母为11,则直接用整数表示。
如:56、10356、103均是最简形式,而3636需要化简为12,3112,31需要化简为33。
分子和分母均不为00,也不为负数。
【输入】
第一行是一个整数nn,表示分数个数,1≤n≤101≤n≤10;
接下来nn行,每行一个分数,用"p/qp/q"的形式表示,不含空格,p,qp,q均不超过1010。
【输出】
输出只有一行,即最终结果的最简形式。若为分数,用"p/qp/q"的形式表示。
代码
#include<iostream>
using namespace std;
int n;
int a[100],c[100];
int ans1=0,ans2=0;
int end_fraction,end_numerator;
char b;
int gcd(int p,int q)
{
if(p%q==0)
return q;
else
return gcd(q,p%q);
}
int main(void)
{
cin>>n;
if(n==1)
{
cin>>a[1]>>b>>c[1];
cout<<a[1]<<"/"<<c[1];
return 0;
}
if(n>=2)
{
cin>>a[1]>>b>>c[1]>>a[2]>>b>>c[2];
ans1+=a[1]*c[2]+a[2]*c[1];
ans2=c[1]*c[2];
}
if(n>=3)
for(int i=3;i<=n;i++)
{
cin>>a[i]>>b>>c[i];
ans1=ans1*c[i]+a[i]*ans2;
ans2*=c[i];
}
end_fraction=ans1/gcd(ans1,ans2);
end_numerator=ans2/gcd(ans1,ans2);
if(end_numerator==1)
{
cout<<end_fraction<<endl;
}
else
{
cout<<end_fraction<<"/"<<end_numerator<<endl;
}
return 0;
}
这道题主要就是模拟分数的加减求和运算所以基本的运算操作就是先通分,然后约分即可。
这里我是先算总和再进行约分。
模拟通分过程:1.将两分数的分母相乘
2.分别将分子乘上另一个数的分母并相加
3.约分:定义一个gcd函数,进行辗转相除法,求得两个分数分母的最大公约数,将最大公约数分别去除最后得到的分子与分母
这道题的分数的输入输出形式比较独特,所以可以使用结构体或者运用类似于高精加的通过字符数组转化为整型数组的方法