总时间限制: 1000ms 内存限制: 65536kB描述
输入n个分数并对他们求和,并用最简形式表示。所谓最简形式是指:分子分母的最大公约数为1;若最终结果的分母为1,则直接用整数表示。
如:5/6、10/3均是最简形式,而3/6需要化简为1/2, 3/1需要化简为3。
分子和分母均不为0,也不为负数。
输入第一行是一个整数n,表示分数个数,1 <= n <= 10; 接下来n行,每行一个分数,用"p/q"的形式表示,不含空格,p,q均不超过10。输出输出只有一行,即最终结果的最简形式。若为分数,用"p/q"的形式表示。样例输入
2
1/2
1/3
样例输出
5/6
1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 #include<cstring>
5 using namespace std;
6 long long int a[1000001];
7 long long int b[1000001];
8 long long int anszi=1;
9 long long int ansmu=1;
10 long long int gcd(long long int a,long long int b)
11 {
12 if(a==0)return b;
13 else return gcd(b%a,a);
14 }
15 int main()
16 {
17 long long int n;
18 cin>>n;
19
20 for(int i=1;i<=n;i++)
21 {
22 scanf("%d/%d",&a[i],&b[i]);
23 }
24 if(n==1)
25 {
26 long long int gys=gcd(a[1],b[1]);
27 a[1]=a[1]/gys;
28 b[1]=b[1]/gys;
29 if(b[1]==1)
30 {
31 cout<<a[1];
32 return 0;
33 }
34 cout<<a[1]<<"/"<<b[1];
35 return 0;
36 }
37 for(int i=1;i<=n-1;i++)
38 {
39 ansmu=b[i+1]*b[i];
40 anszi=a[i]*(ansmu/b[i])+a[i+1]*(ansmu/b[i+1]);
41 b[i+1]=ansmu;
42 a[i+1]=anszi;
43 }
44 long long int zi=anszi;
45 long long int mu=ansmu;
46 long long int gys=gcd(zi,mu);
47 anszi=anszi/gys;
48 ansmu=ansmu/gys;
49 if(ansmu==1)cout<<anszi;
50 else
51 {
52 cout<<anszi<<"/"<<ansmu;
53 }
54 return 0;
55 }
这个题的测试数据比较坑爹
1.要考虑的分母为0的情况
2.要考虑的n为1的情况
3.所有数据全开long long否则最后一个点不过