1034 有理數四則運算
阿新 • • 發佈:2018-12-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<stdio.h> long gcd(long a,long b);//輾轉相除法求最大公約數 long absolute_value(long a);//求絕對值 void my_printf(long a,long b);//按最簡的形式輸出 void addition(long a,long b,long c,long d);//加法 void subtraction(long a,long b,long c,long d);//減法 void multiplication(long a,long b,long c,long d);//乘法 void division(long a,long b,long c,long d);//除法 int main(){ long a1,b1,a2,b2; char ch1,ch2; scanf("%ld%c%ld %ld%c%ld",&a1,&ch1,&b1,&a2,&ch2,&b2); addition(a1,b1,a2,b2); printf("\n"); subtraction(a1,b1,a2,b2); printf("\n"); multiplication(a1,b1,a2,b2); printf("\n"); division(a1,b1,a2,b2); return 0; } long gcd(long a,long b){ a=absolute_value(a); b=absolute_value(b); if(a<b){ long t=a; a=b,b=t; } long c; while(b!=0){ c=a%b; a=b; b=c; } return a; }//greatest common divisor long absolute_value(long a){ long c=a>0?a:-a; return c; } void my_printf(long a,long b){ if(a==0){ printf("0"); } else{ long GCD=gcd(a,b); a/=GCD,b/=GCD; long integer_part=a/b; long sign=a/absolute_value(a); a=sign*(absolute_value(a)-b*absolute_value(integer_part)); if(sign==1){ if(integer_part==0){ printf("%ld/%ld",a,b); } else{ if(a%b==0){ printf("%ld",integer_part); } else{ printf("%ld %ld/%ld",integer_part,a,b); } } } if(sign==-1){ if(integer_part==0){ printf("(%ld/%ld)",a,b); } else{ if(a%b==0){ printf("(%ld)",integer_part); } else{ printf("(%ld %ld/%ld)",integer_part,absolute_value(a),b); } } } } } void addition(long a,long b,long c,long d){ my_printf(a,b); printf(" + "); my_printf(c,d); printf(" = "); my_printf(a*d+c*b,b*d); } void subtraction(long a,long b,long c,long d){ my_printf(a,b); printf(" - "); my_printf(c,d); printf(" = "); my_printf(a*d-c*b,b*d); } void multiplication(long a,long b,long c,long d){ my_printf(a,b); printf(" * "); my_printf(c,d); printf(" = "); my_printf(a*c,b*d); } void division(long a,long b,long c,long d){ my_printf(a,b); printf(" / "); my_printf(c,d); printf(" = "); if(c==0){ printf("Inf"); } else{ a=a*d; b=b*c; if(a*b>0){ a=absolute_value(a),b=absolute_value(b); } else{ a=-absolute_value(a),b=absolute_value(b); }//負號只可能出現在分子前 my_printf(a,b); } }
遺留問題:
測試點2答案錯誤。