编写程序,求N个有理数的和
每个有理数均以分子/分母的形式给出,你输出的和也必须是有理数的形式。
Input
第一行给出一个正整数N(≤100)。
随后一行给出N个有理数,中间用空格隔开,每个有理数均以分子/分母的形式给出。
题目保证所有分子和分母都在long long范围内。另外,负数的符号一定出现在分子前面。
Output
输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。
如果结果的分数部分为0,则只输出整数部分;然后,如果结果的整数部分为0,则只输出分数部分。
Sample Input 1
5
2/5 4/15 1/30 -2/60 8/3
Sample Output 1
3 1/3
求公因数——辗转相除法
//先看看这个函数吧:
int gcd(int a,int b)
{
int t;
while(b!=0)
{
t=a%b;
a=b;
b=t;
}
return a; //a是最大公因数
}
//这里是辗转相除法的递归【b!=0的条件】t=a%b;a=b;b=t;【a为最大公因数】
//递归函数
int gcd(long long int p, long long int q)
{
if (p%q == 0)
return q;
else
return gcd(q, p%q); //相当于while里面的交换
}
//这个是求最大公因数咯
#include<stdio.h>
int gcd(long long int p, long long int q)
{
if (p%q == 0)
return q;
else
return gcd(q, p%q);
}
//这个是求最大公因数咯
int main()
{
long long int a, b,suma = 0, sumb = 1,m;
int n, i;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%lld/%lld", &a, &b);
//不仅要输入分子分母,还要让其与后面的一起另一个分数加和
suma *= b;
//suma为分子,通分乘以分母
suma = (suma + a*sumb);
//下个分子乘以上一个分母,
sumb *= b; //分母相乘通分
//化简分子和分母,就是求出最大公因数后两者一起化简,相当于求最小公倍数
m = gcd(suma, sumb);
suma /= m;
sumb /= m;
}
//真分数情况 格式的输出注意
if (suma&&(suma/sumb==0)){
if(sumb>0) printf("%lld/%lld\n", suma, sumb);
if(sumb<0) printf("%lld/%lld\n", -suma, -sumb);
}
//假分数 要输出整数和分数
else if (suma%sumb==0)
printf("%lld\n", suma / sumb); //一个整数
else //整数和分数
{
if (suma/sumb<0){
if(sumb>0) printf("%lld %lld/%lld\n",suma/sumb,suma%sumb,sumb);
if(sumb<0) printf("%lld %lld/%lld\n",suma/sumb,-suma%sumb,-sumb);
}
else printf("%lld %lld/%lld\n",suma/sumb,suma%sumb,sumb);
}
return 0;
}