2018-10-31 14:13

# 1034 有理数四则运算 测试点2通过不了，求助

 //PAT1034V1
#include <stdio.h>
#include <math.h>
void Addition(long long,long long, long long ,long long);
void Subtract(long long,long long,long long ,long long );
void Multiply(long long,long long,long long ,long long );
void Divide(long long,long long,long long ,long long );
long long gcd(int ,int );

//辗转相除法求最大公约数
long long gcd(int a,int b){
if(b==0) return a;  //可以用条件表达式表达 return b==0?a:gcd(b,a%b)
return gcd(b,a%b);
}

//整理成带分数形式
void print(long long a,long long b){
long long c=0;
if(a>0){    //正数
if(b==1){   //形如3/1
printf("%lld",a);
}
else if(a>b){   //形如5/3
c=a/b;
a-=b*c;
printf("%lld %lld/%lld",c,a,b);
}
else{   //真分数，形如3/5
printf("%lld/%lld",a,b);
}
}
else if(a==0){  //形如0/3
printf("%c",'0');
}
else{   //a<0
if(b==1){
printf("(%lld)",a); //形如-3/1
}
else if(-1*a>b){    //形如-5/3
c=a/b;
a=(-1*a)%b;
printf("(%lld %lld/%lld)",c,a,b);
}
else{
printf("(%lld/%lld)",a,b);  //形如-1/3
}
}
}

void Addition(long long int a1,long long int b1,long long int a2,long long int b2){
print(a1,b1);
printf(" + ");
print(a2,b2);
printf(" = ");
long long a3=a1*b2+a2*b1;
long long b3=b1*b2;
//化简到最简形式，非假分数形式
long long gcd3=abs(gcd(a3,b3));
a3/=gcd3;
b3/=gcd3;
print(a3,b3);
printf("\n");
}

void Subtract(long long a1,long long b1,long long a2,long long b2){
print(a1,b1);
printf(" - ");
print(a2,b2);
printf(" = ");
long long a3=a1*b2-a2*b1;
long long b3=b1*b2;
//化简到最简形式，非假分数形式
long long gcd3=abs(gcd(a3,b3));
a3/=gcd3;
b3/=gcd3;
print(a3,b3);
printf("\n");
}

void Multiply(long long a1,long long b1,long long a2,long long b2){
print(a1,b1);
printf(" * ");
print(a2,b2);
printf(" = ");
long long a3=a1*a2;
long long b3=b1*b2;
//化简到最简形式，非假分数形式
long long gcd3=abs(gcd(a3,b3));
a3/=gcd3;
b3/=gcd3;
print(a3,b3);
printf("\n");
}

void Divide(long long a1,long long b1,long long a2,long long b2){
print(a1,b1);
printf(" / ");
print(a2,b2);
printf(" = ");
if(a2==0){
printf("Inf");
}
else if(a2<0){
long long a3=-1*a1*b2;
long long b3=-1*b1*a2;
long long gcd3=abs(gcd(a3,b3));
a3/=gcd3;
b3/=gcd3;
print(a3,b3);
}
else{   //化简到最简形式，非假分数形式
long long a3=a1*b2;
long long b3=b1*a2;
long long gcd3=abs(gcd(a3,b3));
a3/=gcd3;
b3/=gcd3;
print(a3,b3);
}
printf("\n");
}

int main(){
long long a1,b1,a2,b2;
scanf("%lld/%lld %lld/%lld",&a1,&b1,&a2,&b2);
//先约分到最简形式
long long gcd1=abs(gcd(a1,b1)) ;    //求最大公约数
a1/=gcd1;
b1/=gcd1;
long long gcd2=abs(gcd(a2,b2)) ;    //求最大公约数
a2/=gcd2;
b2/=gcd2;
//统一用最简形式参与运算
Subtract(a1,b1,a2,b2);
Multiply(a1,b1,a2,b2);
Divide(a1,b1,a2,b2);
return 0;
}

• 点赞
• 写回答
• 关注问题
• 收藏
• 邀请回答