本题要求编写程序,计算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
这题不能用int,可以用long ,long long,long long int;
思路:这题的思路主要都在print1中
化简输入的两个分数,输出第一个数,根据+-*/进入不同的选择,计算出来结果,然后输出第二个数,最后化简计算出来的结果,输出结果
#include<cstdio>
#include<iostream>
using namespace std;
long gcd(long a,long b)//找最大公约数
{
if(a<0)a=-a;
if(b==0)return a;
else return gcd(b,a%b);
}
int huajian(long *a,long *b)
{
long a1=*a,b1=*b;
if(a1%b1==0){*a=a1/b1,*b=1;return -1;}//两个数可化为一个数
long y=gcd(a1,b1);
long x=a1/b1;//分数前面的系数
*a/=y,*b/=y;
if(x==0)return 0;//真分数
else//假分数
{
if(x<0)x=-x,*a=-*a,*a-=(*b)*x,*a=-*a;
else *a-=(*b)*x;
return x;
}
}
void print(long x,long a,long b)//打印一个数
{
if(x==-1)//一个数
{
if(a<0)printf("(%ld)",a/b);
else printf("%ld",a/b);
}
else if(x==0)//真分数
{
if(a<0)printf("(%ld/%ld)",a,b);
else
printf("%ld/%ld",a,b);
}
else//假分数
{
if(a<0)
{
x=-x;a=-a;
printf("(%ld ",x);
printf("%ld/%ld)",a,b);
}
else
{
printf("%ld %ld/%ld",x,a,b);
}
}
}
void print1(long *a,long *b,long *c,long *d,char op)
{
long a1=*a,b1=*b,c1=*c,d1=*d,s1,s2,f=0,x1,x2,x3;
x1=huajian(a,b);
x2=huajian(c,d);
print(x1,*a,*b);
switch(op)
{
case '+':printf(" + ");
s1=a1*d1+b1*c1;
s2=b1*d1;
break;
case '-':printf(" - ");
s1=a1*d1-b1*c1;
s2=b1*d1;
break;
case '*':printf(" * ");
s1=a1*c1;
s2=b1*d1;
break;
case '/':printf(" / ");
s1=a1*d1;
s2=b1*c1;
if(s2<0)s2=-s2,s1=-s1;//第二个数不能为负
else if(s2==0)f=1;//标记除数是否为0
break;
default:break;
}
print(x2,*c,*d);
printf(" = ");
if(!f)//除数不为0
{
x3=huajian(&s1,&s2);
print(x3,s1,s2);
cout<<endl;
}
else
cout<<"Inf";
}
int main()
{
long a1,b1,a2,b2;
scanf("%ld/%ld %ld/%ld",&a1,&b1,&a2,&b2);
long a=a1,b=b1,c=a2,d=b2;
print1(&a1,&b1,&a2,&b2,'+');
a1=a,b1=b,a2=c,b2=d;
print1(&a1,&b1,&a2,&b2,'-');
a1=a,b1=b,a2=c,b2=d;
print1(&a1,&b1,&a2,&b2,'*');
a1=a,b1=b,a2=c,b2=d;
print1(&a1,&b1,&a2,&b2,'/');
return 0;
}