本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。
输入格式:
输入第一行给出一个正整数N(≤100)。随后一行按格式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
第一次提交的时候出现了三种错误
浮点错误:题目说输入数据在long型范围,第一次提交时用的int型,会造成数据溢出而时分母,分子等于0,除以0与取余0都会造成浮点错误;最后结果分子为0时,处理约分时也会有浮点错误
格式错误:x%y 与y%x结果不相同,
答案错误: 解决上面两种错误就没了。
另外记住求最大公约数与最小公倍数的方法。
#include<iostream>
using namespace std;
long yue(long x,long y)
{
if(x==0||y==0)
return 0;
long temp;
if(x<y)
{
temp = x;
x = y;
y = temp;
}
while(x%y!=0)
{
temp = x;
x = y;
y = temp%x;
}
return y;
}
long bei(long x,long y)
{
int temp = yue(x,y);
return x*y/temp;
}
int main()
{
int N,flag1,flag2;
long mu1,mu2,zi1,zi2,gong;
char c;
cin>>N;
cin>>zi1>>c>>mu1;
for(int i = 1;i<N;i++)
{
flag1 = 1; //flag为-1说明分子是负数
flag2 = 1;
if(zi1<0)
{
flag1 = -1;
zi1 = zi1*(-1);
}
cin>>zi2>>c>>mu2;
if(zi2<0)
{
flag2 = -1;
zi2 = zi2*(-1);
}
gong = bei(mu1,mu2);
zi1 = gong/mu1*zi1;
zi2 = gong/mu2*zi2;
mu1 = gong;
zi1 = flag1*zi1+flag2*zi2;
}
flag1 = 1;
if(zi1<0)
{
flag1 = -1;
zi1 = zi1*-1;
}
if(zi1==0)
{
cout<<'0';
return 0;
}
gong = yue(zi1,mu1);
zi1 = zi1/gong;
mu1 = mu1/gong;
if(zi1/mu1!=0)
{
if(flag1==-1)
cout<<"-";
cout<<zi1/mu1;
}
if(zi1/mu1!=0&&zi1%mu1!=0)
cout<<" ";
if(zi1%mu1!=0)
{
if(flag1==-1)
cout<<"-";
cout<<zi1%mu1<<'/'<<mu1;
}
if(zi1==0)
cout<<"0";
return 0;
}
//浮点错误,当最后结果分子为0时,计算分子分母的最大公约数时会出现浮点错误,即出现%0的情况;题目说明分子分母
//long范围内,用int型可能会溢出,使分母为0;