本题要求编写程序,计算 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
代码讲解:这题突出的是一个细,要考虑好各种情况,别忘了有可能的溢出所以我用long long 类型
#include<stdio.h>
int gcd(int a,int b)
{
if(a<0)
a=-a;
if(b<0)
b=-b;
int r=a%b;
while(r)
{
a=b;
b=r;
r=a%b;
}
return b;
}
int output(long long a,long long b)
{
int g;
if(b<0)
{
a=-a;
b=-b;
}
if(a<0)
{
if(a%b==0)
{
printf("(%d)",a/b);
}
else
{
g=gcd(a%b,b);
if(a/b)
{
printf("(%lld %lld/%lld)",a/b,-a%b/g,b/g);
}
else
{
printf("(%lld/%lld)",a/g,b/g);
}
}
}
else
{
if(a==0)
printf("0");
else
{
if(a%b==0)
{
printf("%lld",a/b);
}
else
{
g=gcd(a%b,b);
if(a/b)
{
printf("%lld %lld/%lld",a/b,a%b/g,b/g);
}
else
{
printf("%lld/%lld",a/g,b/g);
}
}
}
}
}
void result(int a,int b,int c,int d,char s)
{
int g;
output(a,b);
printf(" %c ",s);
output(c,d);
printf(" = ");
g=gcd(b,d);
long long m,n;
m=(long long)b*d/g;
switch(s)
{
case '+':output(m/b*a+m/d*c,m);break;
case '-':output(m/b*a-m/d*c,m);break;
case '*':output((long long)a*c,(long long)b*d);break;
case '/':if(c==0)printf("Inf");else output((long long)a*d,(long long)b*c);
}
printf("\n");
}
int main()
{
int a,b;
int c,d;
scanf("%d/%d",&a,&b);
scanf("%d/%d",&c,&d);
int g;
result(a,b,c,d,'+');
result(a,b,c,d,'-');
result(a,b,c,d,'*');
result(a,b,c,d,'/');
return 0;
}