N个数求和(PTA)
7-1 N个数求和 (20 分)
本题的要求很简单,就是求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
思路:
每两个相加,分母通分,分子按比例相加,每次运算完成之后化成最简分数。
仅有整数部分输出整数,整数部分为0只输出分数部分(0特殊,输出0),否则整数、分数分开(分数部分都为正数)
这题自己也整了很久,卡17,后来去找了一下题解跑一下发现都有同样的问题(-3/2的时候他们的结果都是-1 1/-2,个人觉得这样是过不了的)
真的自闭,在认为自己思路正确的情况下修改为如下代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #define ll long long 5 using namespace std; 6 7 ll gcd(ll a,ll b) 8 { 9 return a%b==0?b:gcd(b,a%b); 10 } 11 12 void solve(ll &a,ll &b) 13 { 14 ll yue=gcd(a,b); 15 if(yue){ 16 a/=yue; 17 b/=yue; 18 } 19 } 20 21 int main() 22 { 23 int n; 24 ll x,y,fz=0,fm=1; 25 scanf("%d",&n); 26 for(int i=0;i<n;i++){ 27 scanf("%lld/%lld",&x,&y); 28 ll yue=gcd(fm,y),bei=fm/yue*y; 29 fz=fz*(bei/fm)+x*(bei/y); 30 fm=bei; 31 solve(fz,fm); 32 } 33 //仅为0时输出整数部分0 34 if(fz==0){ 35 printf("0\n"); 36 } 37 else if(abs(fz)<abs(fm)){ 38 if(fz*fm<0) printf("-"); 39 printf("%lld/%lld\n",abs(fz),abs(fm)); 40 } 41 else{ 42 printf("%lld",fz/fm); 43 if(fz%fm){ 44 printf(" %lld/%lld",abs(fz%fm),abs(fm)); 45 } 46 printf("\n"); 47 } 48 return 0; 49 }