12:分数求和

时间:2022-05-07
本文章向大家介绍12:分数求和,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

12:分数求和

总时间限制: 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否则最后一个点不过