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
代码:
#include<stdio.h>
#include<stdlib.h>
long long a,b,c,a1,b1,c1,a2,c2,b2;
long long gcd(long long a,long long b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
void output(char s)
{
if(c<0||a<0)
{
printf("(");
}
if(c==0&&a!=0)
{
printf("%lld/%lld",a,b);
}
else if(c!=0&&a==0)
{
printf("%lld",c);
}
else if(c!=0&&a!=0)
{
printf("%lld %lld/%lld",c,a,b);
}
else
{
printf("0");
}
if(c<0||a<0)
{
printf(")");
}
printf(" %c ",s);
if(c1<0||a1<0)
{
printf("(");
}
if(c1==0&&a1!=0)
{
printf("%lld/%lld",a1,b1);
}
else if(c1!=0&&a1==0)
{
printf("%lld",c1);
}
else if(c1!=0&&a1!=0)
{
printf("%lld %lld/%lld",c1,a1,b1);
}
else
{
printf("0");
}
if(c1<0||a1<0)
{
printf(")");
}
printf(" = ");
if(s=='/'&&c1==0&&a1==0)
{
if(a==0&&c==0)
printf("0");
else
printf("Inf");
return ;
}
if(c2<0||a2<0)
{
printf("(");
}
if(c2==0&&a2!=0)
{
printf("%lld/%lld",a2,b2);
}
else if(c2!=0&&a2==0)
{
printf("%lld",c2);
}
else if(c2!=0&&a2!=0)
{
printf("%lld %lld/%lld",c2,a2,b2);
}
else
{
printf("0");
}
if(c2<0||a2<0)
{
printf(")");
}
printf("\n");
}
void change()
{
c=a/b;
if(c==0)
a=a%b;
else
a=llabs(a)%b;
long long tmp=gcd(llabs(a),b);
a=a/tmp;
b=b/tmp;
c1=a1/b1;
if(c1==0)
a1=a1%b1;
else
a1=llabs(a1)%b1;
tmp=gcd(llabs(a1),b1);
a1=a1/tmp;
b1=b1/tmp;
//printf("%lld %lld\n",a1,b1);
}
void add()
{
if(c<0)
a2=(c*b-a)*b1;
else
a2=(c*b+a)*b1;
if(c1<0)
a2+=(c1*b1-a1)*b;
else
a2+=(c1*b1+a1)*b;
b2=b*b1;
long long tmp=gcd(llabs(a2),b2);
a2=a2/tmp;
b2=b2/tmp;
c2=a2/b2;
if(c2==0)
a2=a2%b2;
else
a2=llabs(a2)%b2;
output('+');
}
void minus()
{
if(c<0)
a2=(c*b-a)*b1;
else
a2=(c*b+a)*b1;
if(c1<0)
a2-=(c1*b1-a1)*b;
else
a2-=(c1*b1+a1)*b;
b2=b*b1;
long long tmp=gcd(llabs(a2),b2);
a2=a2/tmp;
b2=b2/tmp;
c2=a2/b2;
if(c2==0)
a2=a2%b2;
else
a2=llabs(a2)%b2;
output('-');
}
void multiply()
{
if(c<0)
a2=(c*b-a);
else
a2=(c*b+a);
if(c1<0)
a2*=(c1*b1-a1);
else
a2*=(c1*b1+a1);
b2=b*b1;
long long tmp=gcd(llabs(a2),b2);
a2=a2/tmp;
b2=b2/tmp;
c2=a2/b2;
if(c2==0)
a2=a2%b2;
else
a2=llabs(a2)%b2;
output('*');
}
void divide()
{
if(c1==0&&a1==0)
output('/');
else
{
if(c<0)
a2=(c*b-a);
else
a2=(c*b+a);
a2*=b1;
if(c1<0)
b2=(c1*b1-a1);
else
b2=(c1*b1+a1);
b2*=b;
if(b2<0)
{
a2=-a2;
b2=-b2;
}
long long tmp=gcd(llabs(a2),b2);
a2=a2/tmp;
b2=b2/tmp;
c2=a2/b2;
if(c2==0)
a2=a2%b2;
else
a2=llabs(a2)%b2;
output('/');
}
}
int main()
{
long long i,j,n,m,k,t;
scanf("%lld/%lld %lld/%lld",&a,&b,&a1,&b1);
change();
add();
minus();
multiply();
divide();
return 0;
}
还没有评论,来说两句吧...