写了235行
点赞的人都可以$\color{gold}{AK}$IOI
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b){
return !b?a:gcd(b,a%b);
}
LL lcm(LL a,LL b){
return a/gcd(a,b)*b;
}
void get_ZJFS(LL &a,LL &b){ //化简
LL GCD=gcd(a,b);
a/=GCD,b/=GCD;
}
void work1(LL a,LL b,int op){
bool flag=false;
if(a*b<0){
printf("(-");
flag=true;
}
if(a<0) a=-a;
if(b<0) b=-b;
bool used=false;
if(a/b>0){ //假分数都要转化成带分数
LL t=a/b;
a%=b;
if(!a){
if(op==1){
if(!flag) printf("%lld + ",t);
else printf("%lld) + ",t);
}else if(op==2){
if(!flag) printf("%lld - ",t);
else printf("%lld) - ",t);
}else if(op==3){
if(!flag) printf("%lld * ",t);
else printf("%lld) * ",t);
}else if(op==4){
if(!flag) printf("%lld / ",t);
else printf("%lld) / ",t);
}
}else printf("%lld ",t);
used=true;
}
if((a>0||!used)&&a%b==0){
if(op==1){
if(!flag) printf("%lld + ",a/b);
else printf("%lld) +",a/b);
}else if(op==2){
if(!flag) printf("%lld - ",a/b);
else printf("%lld) -",a/b);
}else if(op==3){
if(!flag) printf("%lld * ",a/b);
else printf("%lld) *",a/b);
}else if(op==4){
if(!flag) printf("%lld / ",a/b);
else printf("%lld) /",a/b);
}
}else if(a>0||!used){
if(op==1){
if(!flag) printf("%lld/%lld + ",a,b);
else printf("%lld/%lld) + ",a,b);
}else if(op==2){
if(!flag) printf("%lld/%lld - ",a,b);
else printf("%lld/%lld) - ",a,b);
}else if(op==3){
if(!flag) printf("%lld/%lld * ",a,b);
else printf("%lld/%lld) * ",a,b);
}else if(op==4){
if(!flag) printf("%lld/%lld / ",a,b);
else printf("%lld/%lld) / ",a,b);
}
}
}
void work2(LL a,LL b){
bool flag=false; //记录a/b的值是不是负数
if(a*b<0){
printf("(-");
flag=true;
}
if(a<0) a=-a;
if(b<0) b=-b;
bool used=false;
if(a/b>0){ //假分数都要转化成带分数
LL t=a/b;
a%=b;
if(!a) printf("%lld",t);
else printf("%lld ",t);
used=true;
}
if((a>0||!used)&&a%b==0){
printf("%lld",a/b);
if(flag) printf(") = ");
else printf(" = ");
}else if(a>0||!used){
printf("%lld/%lld",a,b);
if(flag) printf(") = ");
else printf(" = ");
}else{
if(flag) printf(") = ");
else printf(" = ");
}
}
void add(LL a1,LL b1,LL a2,LL b2){
get_ZJFS(a1,b1);
work1(a1,b1,1);
get_ZJFS(a2,b2);
work2(a2,b2);
LL LCM=lcm(b1,b2);
a1*=LCM/b1;
a2*=LCM/b2;
b1=b2=LCM;
LL fenzi=a1+a2;
LL fenmu=b1;
bool flag=false;
if(fenzi*fenmu<0){
printf("(-");
flag=true;
}
if(fenzi<0) fenzi=-fenzi;
if(fenmu<0) fenmu=-fenmu;
get_ZJFS(fenzi,fenmu);
if(fenzi%fenmu==0){
printf("%lld",fenzi/fenmu);
if(flag) printf(")");
}else{
if(fenzi/fenmu>0){
printf("%lld ",fenzi/fenmu);
fenzi%=fenmu;
}
printf("%lld/%lld",fenzi,fenmu);
if(flag) printf(")");
}
printf("\n");
}
void sub(LL a1,LL b1,LL a2,LL b2){
get_ZJFS(a1,b1);
work1(a1,b1,2);
get_ZJFS(a2,b2);
work2(a2,b2);
LL LCM=lcm(b1,b2);
a1*=LCM/b1;
a2*=LCM/b2;
b1=b2=LCM;
LL fenzi=a1-a2;
LL fenmu=b1;
bool flag=false;
if(fenzi*fenmu<0){
printf("(-");
flag=true;
}
if(fenzi<0) fenzi=-fenzi;
if(fenmu<0) fenmu=-fenmu;
get_ZJFS(fenzi,fenmu);
if(fenzi%fenmu==0){
printf("%lld",fenzi/fenmu);
if(flag) printf(")");
}else{
if(fenzi/fenmu>0){
printf("%lld ",fenzi/fenmu);
fenzi%=fenmu;
}
printf("%lld/%lld",fenzi,fenmu);
if(flag) printf(")");
}
printf("\n");
}
void mul(LL a1,LL b1,LL a2,LL b2){
get_ZJFS(a1,b1);
work1(a1,b1,3);
get_ZJFS(a2,b2);
work2(a2,b2);
LL fenzi=a1*a2;
LL fenmu=b1*b2;
bool flag=false;
if(fenzi*fenmu<0){
printf("(-");
flag=true;
}
if(fenzi<0) fenzi=-fenzi;
if(fenmu<0) fenmu=-fenmu;
get_ZJFS(fenzi,fenmu);
if(fenzi%fenmu==0){
printf("%lld",fenzi/fenmu);
if(flag) printf(")");
}else{
if(fenzi/fenmu>0){
printf("%lld ",fenzi/fenmu);
fenzi%=fenmu;
}
printf("%lld/%lld",fenzi,fenmu);
if(flag) printf(")");
}
printf("\n");
}
void div(LL a1,LL b1,LL a2,LL b2){
get_ZJFS(a1,b1);
work1(a1,b1,4);
get_ZJFS(a2,b2);
work2(a2,b2);
LL fenzi=a1*b2;
LL fenmu=a2*b1;
bool flag=false;
if(fenzi*fenmu<0){
printf("(-");
flag=true;
}
if(fenzi<0) fenzi=-fenzi;
if(fenmu<0) fenmu=-fenmu;
if(!fenmu) printf("Inf");
else{
get_ZJFS(fenzi,fenmu);
if(fenzi%fenmu==0){
printf("%lld",fenzi/fenmu);
if(flag) printf(")");
}else{
if(fenzi/fenmu>0){
printf("%lld ",fenzi/fenmu);
fenzi%=fenmu;
}
printf("%lld/%lld",fenzi,fenmu);
if(flag) printf(")");
}
}
printf("\n");
}
int main(){
LL a1,b1,a2,b2;
scanf("%lld/%lld %lld/%lld",&a1,&b1,&a2,&b2);
add(a1,b1,a2,b2); //加法运算
sub(a1,b1,a2,b2); //减法运算
mul(a1,b1,a2,b2); //乘法运算
div(a1,b1,a2,b2); //除法运算
return 0;
}