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
算法思想:
通过辗转相除法求最大公约数(不然测试点3大概率超时),然后通过最大公约数化简,注意两个整数的四则运算可能超出整形范围(干脆全部用long long了),注意输出格式控制就OK了。
代码如下:
/***************2019.5.2-15:49-16:00***********/
/***************2019.5.3-11:00-12:10 18:45-19:30***********/
//1034 有理数四则运算 2h
#include<stdio.h>
#include<math.h>
long long GetGCD(long long a, long long b) { //获取最大公约数
return b == 0 ? fabs(a) : GetGCD(b, a % b);
}
void Print(long long a,long long b,int flag){//flag=1表示输出是结果
int tag=0;
if(a<0) {
printf("(");
tag=1;
}
if(a==0){
printf("0");
if(flag==0) printf(" ");
else printf("\n");
return;
}
if(abs(a)>=b){
printf("%lld",a/b);
a=(a%b);
a=abs(a);
if(a!=0) printf(" ");
}
long long GCD=GetGCD(a,b);
if(a!=0)printf("%lld/%lld",a/GCD,b/GCD);
if(tag==1) printf(")");
if(flag==0) printf(" ");
else printf("\n");
}
void PrePrint(long long a1,long long b1,long long a2,long long b2,int flag){//1+ 2- 3* 4/
Print(a1,b1,0);
switch(flag){
case 1:
printf("+ ");
break;
case 2:
printf("- ");
break;
case 3:
printf("* ");
break;
case 4:
printf("/ ");
break;
}
Print(a2,b2,0);
printf("= ");
}
int main(){
long long a1,b1,a2,b2;
scanf("%lld/%lld%lld/%lld",&a1,&b1,&a2,&b2);
long long GCD=GetGCD(b1,b2);
//PrintAdd
PrePrint(a1,b1,a2,b2,1);
if(a1!=0&&a2!=0) Print(a1*(b2/GCD)+a2*(b1/GCD),b1*(b2/GCD),1);
else if(a1==0) Print(a2,b2,1);
else Print(a1,b1,1);
//PrintSub
PrePrint(a1,b1,a2,b2,2);
if(a1!=0&&a2!=0) Print(a1*(b2/GCD)-a2*(b1/GCD),b1*(b2/GCD),1);
else if(a1==0) Print(-a2,b2,1);
else Print(a1,b1,1);
//PrintMult
PrePrint(a1,b1,a2,b2,3);
if(a1!=0&&a2!=0) Print(a1*a2,b1*b2,1);
else printf("0\n");
//PrintDiv
PrePrint(a1,b1,a2,b2,4);
if(a1!=0&&a2!=0){
if(a2<0) Print(-a1*b2,-a2*b1,1);
else Print(a1*b2,a2*b1,1);
}
else if(a1==0) printf("0\n");
else printf("Inf\n");
return 0;
}