注意兩點: 一,題目雖然說範圍在int 中,但是計算過程可能會超過int 所以直接 long long
二 : 最大公約數直接用輾轉相除法:(否則測試點三可能超時)
輾轉相除法, 又名歐幾里德演算法(euclidean algorithm),是求最大公約數的一種方法。它的具體做法是:用較小數除較大數,再用出現的餘數(第一餘數)去除除數,再用出現的餘數(第二餘數)去除第一餘數,如此反覆,直到最後餘數是0為止。如果是求兩個數的最大公約數,那麼最後的除數就是這兩個數的最大公約數。
另一種求兩數的最大公約數的方法是更相減損法。
到此 算是斷斷續續地 終於做完了。(以前的我忘記做這題目了。。。)
下面放個圖留個紀念。23333
1034 有理數四則運算(20 分)
本題要求編寫程式,計算 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
#include using namespace std;
long myp(long long a,long long b)
void func(long long a,long long b) else if(b==1 )
long long k=a/b;
a= (k!=0 ? a%b:a );
long long temp=myp(a,b);
a/=temp;
b/=temp;
if(b<0)
if(a==0)
if(k==0) a<0? printf("(%lld/%lld)",a,b) : printf("%lld/%lld",a,b);
else if(k<0) //k<0 a一定<0
printf("(%lld %lld/%lld)",k,-a,b) ;
else //k>0 a一定》0
printf("%lld %lld/%lld",k,a,b);
}int main()
1034 有理數四則運算 20分
本題要求編寫程式,計算 2 個有理數的和 差 積 商。輸入在一行中按照a1 b1 a2 b2的格式給出兩個分數形式的有理數,其中分子和分母全是整型範圍內的整數,負號只可能出現在分子前,分母不為 0。分別在 4 行中按照有理數1 運算子 有理數2 結果的格式順序輸出 2 個有理數的和 差 積 商。注意...
1034 有理數四則運算 20分
本題要求編寫程式,計算 2 個有理數的和 差 積 商。輸入格式 輸入在一行中按照 a1 b1 a2 b2 的格式給出兩個分數形式的有理數,其中分子和分母全是整型範圍內的整數,負號只可能出現在分子前,分母不為 0。輸出格式 分別在 4 行中按照 有理數1 運算子 有理數2 結果 的格式順序輸出 2 個...
1034 有理數四則運算 20
本題要求編寫程式,計算2個有理數的和 差 積 商。輸入格式 輸入在一行中按照 a1 b1 a2 b2 的格式給出兩個分數形式的有理數,其中分子和分母全是整型範圍內的整數,負號只可能出現在分子前,分母不為0。輸出格式 分別在4行中按照 有理數1 運算子 有理數2 結果 的格式順序輸出2個有理數的和 差...