本題要求編寫程序,計算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
第一次提交有最后兩個測試點每過,原來是雖然題目指出輸出中沒有超過整形,但是在中間運算中相乘部分有可能超過整形,為了方便期間把所有類型全部設置成長整形。
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<ctype.h> 5 #include<math.h> 6 void simp(long *a,long *b){ 7 long temp,temp1,temp2; 8 temp = *a; 9 temp1 = *b; 10 while(temp1){ 11 temp2 = temp%temp1; 12 temp = temp1; 13 temp1 = temp2; 14 } 15 *a = *a/temp; 16 *b = *b/temp; 17 } 18 19 void print(long a,long a1){ 20 long ka = a/a1; 21 a = a%a1; 22 if(a<0||a1<0||ka<0) 23 printf("("); 24 if(a==0) 25 printf("%ld",ka); 26 else if(ka!=0) 27 printf("%ld %ld/%ld",ka,abs(a),abs(a1)); 28 else{ 29 if(a1<0){ 30 a = -a; 31 a1 = -a1; 32 } 33 printf("%ld/%ld",a,a1); 34 } 35 36 if((a<0||a1<0||ka<0)) 37 printf(")"); 38 39 } 40 41 void print1(long a,long a1,long b,long b1,long c,long c1,char k){ 42 simp(&c,&c1); 43 print(a,a1); 44 printf(" %c ",k); 45 print(b,b1); 46 printf(" = "); 47 print(c,c1); 48 printf("\n"); 49 } 50 51 int main(){ 52 long a,a1,b,b1; 53 long c[5][2]; 54 char sign[5]={'+','-','*','/'}; 55 scanf("%ld/%ld",&a,&a1); 56 scanf("%ld/%ld",&b,&b1); 57 58 simp(&a,&a1); 59 simp(&b,&b1); 60 61 c[0][1] = b1*a1; 62 c[0][0] = a*b1+b*a1; 63 c[1][1] = b1*a1; 64 c[1][0] = a*b1-b*a1; 65 c[2][1] = b1*a1; 66 c[2][0] = a*b; 67 c[3][1] = a1*b; 68 c[3][0] = a*b1; 69 70 for(int i=0;i<3;i++){ 71 print1(a,a1,b,b1,c[i][0],c[i][1],sign[i]); 72 } 73 74 if(b==0){ 75 print(a,a1); 76 printf(" / "); 77 print(b,b1); 78 printf(" = "); 79 printf("Inf"); 80 return 0; 81 }else{ 82 print1(a,a1,b,b1,c[3][0],c[3][1],sign[3]); 83 } 84 }