吉大秦少游 2018-10-31 14:13 采纳率: 0%
浏览 1353
已采纳

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;
}
  • 写回答

1条回答 默认 最新

  • Italink 2018-10-31 15:06
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮