PAT (Basic Level) Practice 1034 有理數四則運算
阿新 • • 發佈:2018-12-22
題意簡單粗暴的模擬題,就是非常複雜
首先,我是將數字分成輸入的a1b1c1、a2b2c2,以及輸出的a3b3c3,c代表的是帶分數的整數部分,如果有負數&&c有值,將負數賦予c,這樣便於後期輸出
其次是理好各種細節處理
1.化簡及其效率(測試點4就是測試效率)
2.假分數轉換成帶分數
3.負數、分子為0、帶分數的整數部分為0、計算結果 這四種輸出情況
4.計算時的問題,負的帶分數事實上應該是-(c + a/b)
需在計算上注意
卡了N天,自己在第1、4點上出了毛病,這種題真看細節啊……具體的化簡方法日後奉上
AC程式碼:
#include<iostream> #include<cstring> #include<stdio.h> using namespace std; long long a1,b1,a2,b2,c1,c2,a3,b3,c3; void getnum(){ cin>>a1; getchar(); cin>>b1; cin>>a2; getchar(); cin>>b2; } long long gcd(long long a,long long b) { return b==0?a:gcd(b,a%b); } void simplify(long long &a,long long &b){ int d = gcd(a,b); if(d<0) d = -d; a = a/d; b = b/d; } void improper_to_proper(long long &a,long long &b,long long &c){ //假分數轉真分數 c = a/b; if(c>=0) a -= (b*c); else a = (a - b*c)*(-1); } void pr(long long &a,long long &b,long long &c){ if(a==0){ if(c>=0){ cout<<c; }else{ cout<<'('<<c<<')'; } }else{ if(c>0){ cout<<c<<' '<<a<<'/'<<b; }else if(c==0){ if(a>0){ cout<<a<<'/'<<b; }else{ cout<<'('<<a<<'/'<<b<<')'; } }else{ cout<<'('<<c<<' '<<a<<'/'<<b<<')'; } } } void sum(){//求和 if(c1<0){ if(c2<0){ a3 = (c1*b1-a1)*b2 + (c2*b2-a2)*b1; }else{ a3 = (c1*b1-a1)*b2 + (c2*b2+a2)*b1; } }else{ if(c2<0){ a3 = (c1*b1+a1)*b2 + (c2*b2-a2)*b1; }else{ a3 = (c1*b1+a1)*b2 + (c2*b2+a2)*b1; } } b3 = b1*b2; simplify(a3,b3); improper_to_proper(a3,b3,c3); pr(a1,b1,c1); cout<<" + "; pr(a2,b2,c2); cout<<" = "; pr(a3,b3,c3); cout<<endl; } void subtraction(){ if(c1<0){ if(c2<0){ a3 = (c1*b1-a1)*b2 - (c2*b2-a2)*b1; }else{ a3 = (c1*b1-a1)*b2 - (c2*b2+a2)*b1; } }else{ if(c2<0){ a3 = (c1*b1+a1)*b2 - (c2*b2-a2)*b1; }else{ a3 = (c1*b1+a1)*b2 - (c2*b2+a2)*b1; } } b3 = b1*b2; simplify(a3,b3); improper_to_proper(a3,b3,c3); pr(a1,b1,c1); cout<<" - "; pr(a2,b2,c2); cout<<" = "; pr(a3,b3,c3); cout<<endl; } void multiplication(){ if(c1<0){ if(c2<0){ a3 = (c1*b1-a1)*(c2*b2-a2); }else{ a3 = (c1*b1-a1)*(c2*b2+a2); } }else{ if(c2<0){ a3 = (c1*b1+a1)*(c2*b2-a2); }else{ a3 = (c1*b1+a1)*(c2*b2+a2); } } b3 = b1*b2; simplify(a3,b3); improper_to_proper(a3,b3,c3); pr(a1,b1,c1); cout<<" * "; pr(a2,b2,c2); cout<<" = "; pr(a3,b3,c3); cout<<endl; } void division(){ pr(a1,b1,c1); cout<<" / "; pr(a2,b2,c2); cout<<" = "; if(c2==0&&a2==0){ cout<<"Inf"<<endl; // cout<<"Inf"; return; } if(c1<0){ if(c2<0){ a1 = c1*b1-a1; a2 = c2*b2-a2; }else{ a1 = c1*b1-a1; a2 = c2*b2+a2; } }else{ if(c2<0){ a1 = c1*b1+a1; a2 = c2*b2-a2; }else{ a1 = c1*b1+a1; a2 = c2*b2+a2; } } a3 = a1*b2; b3 = a2*b1; if(b3<0){ a3 = -a3; b3 = -b3; } simplify(a3,b3); improper_to_proper(a3,b3,c3); pr(a3,b3,c3); cout<<endl; } int main(){ getnum(); simplify(a1,b1); improper_to_proper(a1,b1,c1); simplify(a2,b2); improper_to_proper(a2,b2,c2); sum(); subtraction(); multiplication(); division(); }