【1081】Rational Sum (20 分)

简介: 【1081】Rational Sum (20 分)【1081】Rational Sum (20 分)
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>  
#include<map>
#include<vector>
#include<queue> 
using namespace std; 
typedef long long ll;  //记ll为long long
ll gcd(ll a,ll b){       //求a与b的最大公约数
  return b==0?a:gcd(b,a%b);
}
struct Fraction{  //分数
  ll up,down;  //分子,分母
};
Fraction reduction(Fraction result){  //化简
  if(result.down <0) {  //分母为负数,令分子和分母都变为相反数
    result.up=-result.up;
    result.down=-result.down;
  }
  if(result.up == 0){       //如果分子为0
    result.down=1;  //令分母为1
  }else{                     //如果分子不为0,进行约分
    int d=gcd(abs(result.up) , abs(result.down));  //分子分母的最大公约数
    result.up /= d;  //约去最大公约数
    result.down /= d;
  }
  return result;
}
Fraction add(Fraction f1,Fraction f2){  //分数f1加上分数f2
  Fraction result;
  result.up=f1.up*f2.down+f2.up*f1.down;    //分数和的分子
  result.down=f1.down *f2.down;  //分数和的分母
  return reduction(result);             //返回结果分数,注意化简
}
void showResult(Fraction r){   //输出分数r
  reduction(r);
  if(r.down == 1) printf("%lld",r.up);  //整数
  else if(abs(r.up) > r.down){               //假分数
    printf("%lld %lld/%lld\n",r.up / r.down, abs(r.up)%r.down , r.down);
  }else{                                   //真分数
    printf("%lld/%lld\n",r.up,r.down);
  }
}
int main(){   
  int n;  //分数个数
  scanf("%d",&n);     //分数个数
  Fraction sum,temp;   
  sum.up=0;sum.down=1 ;//初值:和的分子为0,分母为1!!!
  for(int i=0;i<n;i++){
    scanf("%lld/%lld",&temp.up,&temp.down);
    sum=add(sum,temp);      //sum增加temp
  }
  showResult(sum);  //输出结果
  system("pause");
    return 0;   
}
相关文章
|
算法
poj 2479 Maximum sum(求最大子段和的延伸)
看完最大连续子段和 的 dp算法 这个很容易理解,我用dplift[i]保存第1到第i个之间的最大子段和,dpright[i]保存第i到第n个之间的最大子段和,最终结果就是dplift[i]+dpright[i+1]中最大的一个。
60 0
|
C++
【PAT甲级 - C++题解】1081 Rational Sum
【PAT甲级 - C++题解】1081 Rational Sum
103 0
|
算法
1081. Rational Sum (20)
1081. Rational Sum (20)
145 0
1081. Rational Sum (20)
h0125. 求sum(2) (15 分)
h0125. 求sum(2) (15 分)
71 0
【1093】Count PAT‘s (25分)【递推】
若直接暴力解会超时!! 可以先算出T的个数(一层for
117 0
【1029】Median (25 分)
【1029】Median (25 分) 【1029】Median (25 分)
127 0
【1088】Rational Arithmetic (20 分)
【1088】Rational Arithmetic (20 分) 【1088】Rational Arithmetic (20 分)
112 0
【1015】Reversible Primes (20 分)
【1015】Reversible Primes (20 分) 【1015】Reversible Primes (20 分)
89 0
【1108】Finding Average (20分)【字符串处理】
【1108】Finding Average (20分)【字符串处理】 【1108】Finding Average (20分)【字符串处理】
93 0