PAT甲级吧 1081 Rational Sum (20分)
本题坑点int会导致倒数第二个测试点答案错误或者浮点溢出,要考虑输出为0,输出分母为负,为正,带整数字,没带整数字的情况,附上本人暴力代码。本题暴力可以完美AC。方法为小学生都懂的那种方法,注意最小公倍数等于两数之积除以最小公因数
#include <iostream>
#include <cstdio>
#include <map>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b){ return b==0?a:gcd(b,a%b);}
LL a[200],b[200];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lld/%lld",&a[i],&b[i]);
}
// for(int i=0;i<n;i++)
// {
// printf(" %d/%d ",a[i],b[i]);
// }
LL maxs=0,temps=0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
temps=(b[i]*b[j])/gcd(b[i],b[j]);
if(temps>maxs)
{maxs=temps;}
}
}
LL sum=0;
for(int i=0;i<n;i++)
{
sum=sum+a[i]*(maxs/b[i]);
}
LL jj=gcd(sum,maxs);
int f=0;
if(sum/maxs!=0)
{printf("%lld",sum/maxs);f++;}
else if(sum/maxs==0&&sum==0)
{cout<<"0";}
if(sum%maxs!=0&&jj>0&&f>0)
{cout<<" ";printf("%lld",(sum%maxs)/jj);cout<<"/";printf("%lld",abs(maxs/jj));}
else if(sum%maxs!=0&&jj>0&&f==0)
{printf("%lld",(sum%maxs)/jj);cout<<"/";printf("%lld",abs(maxs/jj));}
else if(sum%maxs!=0&&jj<0)
{cout<<"-";printf("%lld",(sum%maxs)/jj);cout<<"/";printf("%lld",abs(maxs/jj));
}
}