本题关键在于化简与输出格式
试过LL, 但是PTA数据都比较简单int就可以过了
化简通过辗转相除法,使用了gcd板子
1.每次输入的时候化简, 有利于空间不用开LL
2.每次求和化简
3.输出要分情况讨论
//求最大公约数
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
#include<iostream>
using namespace std;
const int N = 100 + 10;
typedef long long LL;
int n;
int a[N], b[N];
//求最大公约数
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
//化简
void reduce(int i)
{
int t = gcd(abs(a[i]), b[i]);
a[i] = a[i] / t;
b[i] = b[i] / t;
}
int main()
{
cin>>n;
for(int i = 0; i < n ;i++)
{
scanf("%d/%d", &a[i], &b[i]);
reduce(i);
}
for(int i = 1; i < n; i++)
{
int t = gcd(b[i], b[i - 1]);
a[i] = b[i - 1] / t * a[i] + b[i] / t * a[i - 1];
b[i] = b[i - 1] / t * b[i];
reduce(i);
}
int res1 = a[n - 1] / b[n - 1];
int res2 = a[n - 1] % b[n - 1];
if(res1 == 0)
{
if(res2 == 0) cout<<"0"<<endl;
else cout<<a[n - 1]<<"/"<<b[n - 1]<<endl;
}
else
{
if(res2 == 0) cout<<res1<<endl;
else cout<<res1<<" "<<res2<<"/"<<b[n - 1]<<endl;
}
return 0;
}
扩展一些知识点:
N个数最大公约数
一直用gcd就可以
N个数的最小公倍数
简单举例
2个数求最小公倍数
6, 10
gcd(6, 10) = 2;
最小公倍数 = 6 * 10 / 2 = 30;
3个数求最小公倍数
6, 10, 14;
==> gcd(30, 14) = 2;
最小公倍数 = 30 * 14 / 2 = 210;
递推可得出N个数的最小公倍数