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("
");
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 }
原文地址:https://www.cnblogs.com/lolybj/p/6225769.html