PAT A1081 Rational Sum (20) [分數的四則運算]
阿新 • • 發佈:2020-07-19
題目
題目連結
求幾個分數的和
解題思路
1 分數儲存
2 分數化簡
3 分數列印
4 分數運算-加
易錯點
1 分數化簡中,分子為0,分母要記得置為1
2 加和之後記得化簡
3 最大公約數的計算,返回絕對值,如果最大公約數為負數,化簡後格式又不滿足符號在分子的要求了
4 假分數的判定為分子絕對值大於分母,因為符號在分子上
單詞語法
denominator 分母
numerator 分子
range 範圍
rational numbers 有理數
rational 理性的;合理的
Code
Code 01
#include <iostream> #include <algorithm> #include <cmath> using namespace std; // 分數儲存 struct Fraction { int u;//up int d;//down }; // 最大公約數 int gcd(int a, int b) { if(b==0)return abs(a); else return gcd(b,a%b); } // 分數化簡 Fraction reduction(Fraction fra) { if(fra.d<0) { // 分母小於0,分子分母同時變號 fra.d*=-1; fra.u*=-1; } if(fra.u==0) { //分子為0,分母置為1 fra.d=1; } else { // 有公約數,消去公約數 int gc = gcd(fra.d,fra.u); fra.u/=gc; fra.d/=gc; } return fra; } // 分數列印 void show(Fraction fra) { //化簡 fra = reduction(fra); //若分母為1,直接列印分子 if(fra.d==1)printf("%d",fra.u); // 若為假分數,列印整數+真分數 else if(abs(fra.u)>fra.d) { printf("%d %d/%d", fra.u/fra.d, abs(fra.u)%fra.d, fra.d); }else { printf("%d/%d", fra.u, fra.d); } } // 分數相加 Fraction add(Fraction a, Fraction b) { Fraction c; c.u = a.u*b.d+a.d*b.u; c.d = a.d*b.d; return reduction(c); } int main(int argc,char * argv[]) { int n; Fraction ans; scanf("%d",&n); for(int i=0; i<n; i++) { Fraction temp; scanf("%d/%d",&temp.u,&temp.d); if(i==0)ans=temp; else ans = add(ans,temp); } show(ans); return 0; }
Code 02
#include <iostream> #include <cstdlib> using namespace std; long long gcd(long long a, long long b) { return b == 0 ? abs(a) : gcd(b, a % b); } int main() { long long n, a, b, suma = 0, sumb = 1, gcdvalue; scanf("%lld", &n); for(int i = 0; i < n; i++) { scanf("%lld/%lld", &a, &b); gcdvalue = gcd(a, b); a = a / gcdvalue; b = b / gcdvalue; suma = a * sumb + suma * b; sumb = b * sumb; gcdvalue = gcd(suma, sumb); sumb = sumb / gcdvalue; suma = suma / gcdvalue; } long long integer = suma / sumb; suma = suma - (sumb * integer); if(integer != 0) { printf("%lld", integer); if(suma != 0) printf(" "); } if(suma != 0) printf("%lld/%lld", suma, sumb); if(integer == 0 && suma == 0) printf("0"); return 0; }