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; 
    //统一用最简形式参与运算
    Addition(a1,b1,a2,b2); 
    Subtract(a1,b1,a2,b2); 
    Multiply(a1,b1,a2,b2); 
    Divide(a1,b1,a2,b2); 
    return 0;
}
c

1个回答

将gcd的两个int形参也改成long long测试点就都能通过了,扎心不...

zhanshen112
吉大秦少游 谢谢
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐