//鹅鹅鹅,太粗鲁了
//别看了,我都看不下去,请绕路
#include<stdio.h>
#include<math.h>
print(int a1,int b1,int f);//输出=号后面的结果
void yuefen(int *p1,int *p2);//将m,n进行约分
void judge(int *p1,int *p2);//判断m,n不同正负时的情况
void main()
{
int a1,b1,a2,b2;
int m,n,t;
scanf("%d/%d%d/%d",&a1,&b1,&a2,&b2);
for(t=1;t<=4;t++){//+,-,*,/进行四次
print(a1,b1,1);
if(t==1){
printf(" + ");
print(a2,b2,1);
printf(" = ");
m=a1*b2+a2*b1;
n=b1*b2;
if(n<0){//保证分母不为负数
m=-m;
n=-n;
}
judge(&m,&n);
print(m,n,1);
printf("\n");
}
if(t==2){
printf(" - ");
print(a2,b2,1);
printf(" = ");
m=a1*b2-a2*b1;
n=b1*b2;//注意此时的m,n因为已经被指了,所以值有变
if(n<0){
m=-m;
n=-n;
}
judge(&m,&n);
print(m,n,1);
printf("\n");
}
if(t==3){
printf(" * ");
print(a2,b2,1);
printf(" = ");
m=a1*a2;
n=b1*b2;
if(n<0){
m=-m;
n=-n;
}
judge(&m,&n);
print(m,n,1);
printf("\n");
}
if(t==4){
printf(" / ");
print(a2,b2,1);
printf(" = ");
if(print(a2,b2,2)==48){//分母为零的话,输出Inf
printf("Inf");continue;
}
m=a1*b2;
n=a2*b1;
if(n<0){
m=-m;
n=-n;
}
judge(&m,&n);
print(m,n,1);
printf("\n");
}
}
}
print(int a1,int b1,int f)
{
int i;
char a[10];//将每一部分数据放到a里面
if(a1>0){
if(a1>b1){
if(a1%b1==0){
a[0]='0'+b1/a1;
a[1]='\0';
}else{
a[0]='0'+a1/b1;
a[1]=' ';
a[2]=a1%b1+'0';
a[3]='/';
a[4]=b1+'0';
a[5]='\0';
}
}else{
if(a1==b1){
a[0]='1';
a[1]='\0';
}else{
a[0]=a1+'0';
a[1]='/';
a[2]=b1+'0';
a[3]='\0';
}
}
}else{
if(a1==0){
a[0]='0';
a[1]='\0';
}else{
if((-1)*a1>b1){
if(a1*(-1)%b1==0){
a[0]='(';
a[1]='-';
a[2]=a1*(-1)/b1+'0';
a[3]=')';
a[4]='\0';
}else{
a[0]='(';
a[1]='-';
a[2]='0'+a1/b1*(-1);
a[3]=' ';
a[4]=a1*(-1)%b1+'0';
a[5]='/';
a[6]=b1+'0';
a[7]=')';
a[8]='\0';
}
}else{
if(a1*(-1)==b1){
a[0]='(';
a[1]='-';
a[2]='1';
a[3]=')';
a[4]='\0';
}else{
a[0]='(';
a[1]='-';
a[2]=a1*(-1)+'0';
a[3]='/';
a[4]=b1+'0';
a[5]=')';
a[6]='\0';
}
}
}
}
if(f==1){//此时有输出的情况,有不输出的情况,所以函数不指明类型,默认为int
for(i=0;a[i]!='\0';i++){//由于输出分子分母可能存在大于9的情况,所以字符输出需要注意
if(a[i]!='+'&&a[i]!='-'&&a[i]!='*'&&a[i]!='/'&&a[i]!='('&&a[i]!=')'&&a[i]!=' '){
printf("%d",a[i]-'0');
}else{
printf("%c",a[i]);
}
}
}
if(f==2){
return a[0];
}
}
void yuefen(int *p3,int *p4)
{
int i=0;
do{
i++;
if(*p3%i==0&&*p4%i==0){
*p3=*p3/i;
*p4=*p4/i;
i=1;
}
}while(i<*p4);
}
void judge(int *p1,int *p2)
{
if((*p1)*(*p2)<0){
*p1=fabs(*p1);
*p2=fabs(*p2);
yuefen(p1,p2);
*p1=-*p1;
}else{
*p1=fabs(*p1);
*p2=fabs(*p2);
yuefen(p1,p2);
}
}
//对程序做进一步的优化,采用的解决方法不变
#include<string.h>//这里没有用到stdio.h,而是使用string.h头文件,暂时还不能理解
int GYS(long a,long b);//求出a,b的最小公倍数
void func(long a,long b);//对每一块进行输出
void main()
{
long a1,b1,a2,b2;
char ch[4]={'+','-','*','/'};
int i;
scanf("%ld/%ld %ld/%ld",&a1,&b1,&a2,&b2);
for(i=0;i<4;i++){
func(a1,b1);
printf(" %c ",ch[i]);
func(a2,b2);
printf(" = ");
switch(ch[i]){//此处使用switch结构,再调用函数输出可省去每次循环的相同结构
case '+': func(a1*b2+a2*b1,b1*b2);break;
case '-': func(a1*b2-a2*b1,b1*b2);break;
case '*': func(a1*a2,b1*b2);break;
case '/': func(a1*b2,b1*a2);break;
}
printf("\n");
}
}
int GYS(long a,long b)
{
return b==0?a:GYS(b,a%b);//函数的递归调用求最小公倍数
}
void func(long a,long b)
{
int sign=1;
long mcd=1;
if(b==0){
printf("Inf");
return;//return相当于函数的break,表示不返回任何值
}
if(a<0){
a=-a;
sign*=-1;
}
if(b<0){
b=-b;
sign*=-1;
}
mcd=GYS(a,b);
a/=mcd;b/=mcd;
if(sign<0)
printf("(-");
if(a/b&&a%b)
printf("%ld %ld/%ld",a/b,a%b,b);
else if(a%b)
printf("%ld/%ld",a,b);
else
printf("%ld",a/b);
if(sign<0)printf(")");
}