本題要求編寫程式,計算 2 個有理數的和、差、積、商。
輸入在一行中按照a1/b1 a2/b2
的格式給出兩個分數形式的有理數,其中分子和分母全是整型範圍內的整數,負號只可能出現在分子前,分母不為 0。
分別在 4 行中按照有理數1 運算子 有理數2 = 結果
的格式順序輸出 2 個有理數的和、差、積、商。注意輸出的每個有理數必須是該有理數的最簡形式k a/b
,其中k
是整數部分,a/b
是最簡分數部分;若為負數,則須加括號;若除法分母為 0,則輸出inf
。題目保證正確的輸出中沒有超過整型範圍的整數。
2/3 -4/2
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
5/3 0/6
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = inf
整整寫了兩天,重寫了很多遍,需要注意的問題有幾個,判斷的時候別兩個數別直接乘,會超出正數範圍;一定要算最大公約數來簡化分數,用暴力演算法會超時會越界。順利的時候一點可以寫幾道題,不順利的時候幾天寫不了一道題,有些坑真的是又深又硬,考試的時候遇到這種還是直接放棄吧,不要在一半分上鑽牛角尖。
1 #include2 #include3 #include4using
namespace
std;
5long
long
int gys(long
long a,long
longb)8
void num1(long
long a, long
long
b)14
long
long
c;15
if(a==0
)else
if(abs(a)>abs(b))else
2526 }else
if(a%b==0
)else
29 cout<"/"
<3132
intmain()else
47num1(a1,b1);
48 cout<<"+ "
;
49//
輸出第二個有理數
50if((a2<0&&b2>0)||(a2>0&&b2<0
))else
53num1(a2,b2);
54//
輸出計算結果
55 a=a1*b2+a2*b1;
56 b=b1*b2;
57 c=gys(a,b);
58 a=a/c;
59 b=b/c;
60if(b==0
)61 cout<<"
= inf";
62else
if(a==0
)63 cout<<"
= 0";64
else
if((a<0&&b>0)||(a>0&&b<0
))else
7071 cout<<"\n"
;72//減法
73//
輸入第乙個有理數
74if((a1<0&&b1>0)||(a1>0&&b1<0
))else
77num1(a1,b1);
78 cout<<"- "
;79//輸入第二個有理數
80if((a2<0&&b2>0)||(a2>0&&b2<0
))else
83num1(a2,b2);
84 a=a1*b2-a2*b1;
85 b=b1*b2;
86 c=gys(a,b);
87 a=a/c;
88 b=b/c;
89if(b==0
)90 cout<<"
= inf";
91else
if(a==0
)92 cout<<"
= 0";93
else
if((a<0&&b>0)||(a>0&&b<0
))else
98 cout<<"\n"
;
99//
乘法 100
if((a1<0&&b1>0)||(a1>0&&b1<0
))else
103num1(a1,b1);
104 cout<<"* "
;
105if((a2<0&&b2>0)||(a2>0&&b2<0
))else
108num1(a2,b2);
109 a=a1*a2;
110 b=b1*b2;
111 c=gys(a,b);
112 a=a/c;
113 b=b/c;
114if(b==0
)115 cout<<"
= inf";
116else
if(a==0
)117 cout<<"
= 0"
;118
else
if((a<0&&b>0)||(a>0&&b<0
))else
123 cout<<"\n"
;124
//除法
125if((a1<0&&b1>0)||(a1>0&&b1<0
))else
128num1(a1,b1);
129 cout<<"/ "
;130
if((a2<0&&b2>0)||(a2>0&&b2<0
))else
133num1(a2,b2);
134 a=a1*b2;b=b1*a2;
135 c=gys(a,b); a=a/c;b=b/c;
136if(b==0
)137 cout<<"
= inf";
138else
if(a%b==0
)141
else
if(a==0
)142 cout<<"
= 0"
;143
else
if(a==b)
144 cout<<"
= 1"
;145
else
if((a<0&&b>0)||(a>0&&b<0
))else
151return0;
152 }
1034 有理數四則運算(20 分)
注意兩點 一,題目雖然說範圍在int 中,但是計算過程可能會超過int 所以直接 long long 二 最大公約數直接用輾轉相除法 否則測試點三可能超時 輾轉相除法,又名歐幾里德演算法 euclidean algorithm 是求最大公約數的一種方法。它的具體做法是 用較小數除較大數,再用出現的餘...
1034 有理數四則運算 20分
本題要求編寫程式,計算 2 個有理數的和 差 積 商。輸入格式 輸入在一行中按照 a1 b1 a2 b2 的格式給出兩個分數形式的有理數,其中分子和分母全是整型範圍內的整數,負號只可能出現在分子前,分母不為 0。輸出格式 分別在 4 行中按照 有理數1 運算子 有理數2 結果 的格式順序輸出 2 個...
1034 有理數四則運算 20
本題要求編寫程式,計算2個有理數的和 差 積 商。輸入格式 輸入在一行中按照 a1 b1 a2 b2 的格式給出兩個分數形式的有理數,其中分子和分母全是整型範圍內的整數,負號只可能出現在分子前,分母不為0。輸出格式 分別在4行中按照 有理數1 運算子 有理數2 結果 的格式順序輸出2個有理數的和 差...