PAT-1034 有理數四則運算
阿新 • • 發佈:2018-11-13
1034 有理數四則運算 (20 分)
本題要求編寫程式,計算 2 個有理數的和、差、積、商。
輸入格式:
輸入在一行中按照 a1/b1 a2/b2
的格式給出兩個分數形式的有理數,其中分子和分母全是整型範圍內的整數,負號只可能出現在分子前,分母不為 0。
輸出格式:
分別在 4 行中按照 有理數1 運算子 有理數2 = 結果
的格式順序輸出 2 個有理數的和、差、積、商。注意輸出的每個有理數必須是該有理數的最簡形式 k a/b
,其中 k
是整數部分,a/b
是最簡分數部分;若為負數,則須加括號;若除法分母為 0,則輸出 Inf
。題目保證正確的輸出中沒有超過整型範圍的整數。
輸入樣例 1:
2/3 -4/2
輸出樣例 1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
輸入樣例 2:
5/3 0/6
輸出樣例 2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf
#include<iostream> #include<stdio.h> using namespace std; long long a1,a2,b1,b2; int gong(long long a,long long b)//用輾轉相除法計算兩個數的最大公約數 { long long r,max,min; if(a>b) { max=a; min=b; } else { max=b; min=a; } r=max%min; while(r) { max=min; min=r; r=max%min; } return min; } void print(long long a,long long b)//輸出函式也要設計一下 { int flag=0,c,d,e; if(a<0) { a=-a; flag=1; } if(a==0) { cout<<"0"; } else { e=gong(a,b); a/=e; b/=e; c=a/b; d=a%b; if(flag==1) cout<<"(-"; if(d==0) { cout<<c; } if(d!=0) { if(c!=0) cout<<c<<" "; cout<<d<<"/"<<b; } if(flag==1) { cout<<")"; } } } void add(long long a1,long long b1,long long a2,long long b2) { print(a1,b1); cout<<" + "; print(a2,b2); cout<<" = "; print(a1*b2+a2*b1,b1*b2); cout<<endl; } void jian(long long a1,long long b1,long long a2,long long b2) { print(a1,b1); cout<<" - "; print(a2,b2); cout<<" = "; print(a1*b2-a2*b1,b1*b2); cout<<endl; } void muilt(long long a1,long long b1,long long a2,long long b2) { print(a1,b1); cout<<" * "; print(a2,b2); cout<<" = "; print(a1*a2,b1*b2); cout<<endl; } void divide(long long a1,long long b1,long long a2,long long b2) { print(a1,b1); cout<<" / "; print(a2,b2); cout<<" = "; if(a2==0) { cout<<"Inf"<<endl; } else { if(a2<0)//注意這裡要將負號換位,因為在print()函式中,我們只檢測a的正負值 { a1=-a1; a2=-a2; } print(a1*b2,b1*a2); cout<<endl; } } int main() { cin>>a1; getchar(); cin>>b1; cin>>a2; getchar(); cin>>b2; add(a1,b1,a2,b2); jian(a1,b1,a2,b2); muilt(a1,b1,a2,b2); divide(a1,b1,a2,b2); return 0; }