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 }