本题要求编写程序,计算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 int gong(long long a,long long b) 3 { 4 long long r,min,max; 5 min=(a>b)?b:a; 6 max=(a>b)?a:b; 7 r=max%min; 8 while(r) 9 { 10 max=min; 11 min=r; 12 r=max%min; 13 } 14 return min; 15 } 16 void print(long long a,long long b) 17 { 18 long long flag=0,c,d,e; 19 if(a<0){ 20 a=-a; 21 flag=1; 22 } 23 if(a==0) printf("0"); 24 else{ 25 e=gong(a,b); 26 a/=e; 27 b/=e; 28 c=a/b; 29 d=a%b; 30 if(flag==0){ 31 if(d==0) printf("%lld",c); 32 else{ 33 if(c==0) printf("%lld/%lld",a,b); 34 else printf("%lld %lld/%lld",c,d,b); 35 } 36 } 37 else{ 38 if(d==0) printf("(-%lld)",c); 39 else{ 40 if(c==0) printf("(-%lld/%lld)",a,b); 41 else printf("(-%lld %lld/%lld)",c,d,b); 42 } 43 } 44 } 45 } 46 void add(long long a1,long long b1,long long a2,long long b2) 47 { 48 print(a1,b1); 49 printf(" + "); 50 print(a2,b2); 51 printf(" = "); 52 print(a1*b2+a2*b1,b1*b2); 53 printf("\n"); 54 } 55 void minus(long long a1,long long b1,long long a2,long long b2) 56 { 57 print(a1,b1); 58 printf(" - "); 59 print(a2,b2); 60 printf(" = "); 61 print(a1*b2-a2*b1,b1*b2); 62 printf("\n"); 63 } 64 void muilt(long long a1,long long b1,long long a2,long long b2) 65 { 66 print(a1,b1); 67 printf(" * "); 68 print(a2,b2); 69 printf(" = "); 70 print(a1*a2,b1*b2); 71 printf("\n"); 72 } 73 void divide(long long a1,long long b1,long long a2,long long b2) 74 { 75 print(a1,b1); 76 printf(" / "); 77 print(a2,b2); 78 printf(" = "); 79 if(a2==0) printf("Inf\n"); 80 else{ 81 if(a2<0){ 82 a2=-a2; 83 a1=-a1; 84 } 85 print(a1*b2,b1*a2); 86 printf("\n"); 87 } 88 } 89 int main() 90 { 91 long long a1,b1,a2,b2; 92 while(~scanf("%lld/%lld %lld/%lld",&a1,&b1,&a2,&b2)) 93 { 94 add(a1,b1,a2,b2); 95 minus(a1,b1,a2,b2); 96 muilt(a1,b1,a2,b2); 97 divide(a1,b1,a2,b2); 98 } 99 return 0; 100 }
PAT乙级1034. 有理数四则运算(20)
时间: 2024-10-14 05:29:30