吉大秦少游 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测试点就都能通过了,扎心不...

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

报告相同问题?

悬赏问题

  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作