PAT 1034. 有理數四則運算(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
第一次提交有最后兩個測試點每過,原來是雖然題目指出輸出中沒有超過整形,但是在中間運算中相乘部分有可能超過整形,為了方便期間把所有類型全部設置成長整形。
 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM