PAT甲级1088.

目录

A1088

题目

样例

样例1

输入:

2/3 -4/2

输出:

2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)

样例2

输入:

5/3 0/6

输出:

1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

思路和坑点

  分数的运算。使用结构体表示一个分数。按照分数的计算方法进行计算。
  坑点:
  一、分数的表示,即分数的打印,需要考虑真分数,假分数,还有整数已经正负号问题。
  二、分数的运算中,需要时时刻刻注意化简分子和分母,另外求解分子和分母的公约数的时候要分别加上绝对值只有再求。

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef struct{                             //分数结构体 
    long long up;
    long long down;
}FEN;
long long gcd(long long a,long long b){//求最小公约数 
    return !b?a:gcd(b,a%b);
}
void yuefen(FEN *py){                       //约分成最简形式 
    long long y;
    if(py->up==0)                           //如果分子是0,令分母为1 
        py->down=1;
    else{
        y=gcd(abs(py->up),abs(py->down));   //求分子分母绝对值的最大公约数,一定要绝对值之后求公约数 
        py->up/=y; py->down/=y;             //约分 
    }
}
void print_fen(FEN *pf){                    //分数的打印 
    long long up=pf->up,down=pf->down;
    if(up==0){                              //如果是0,直接打0 
        putchar('0'); return;
    }
    if(up<0) putchar('(');                  //如果是负数,打印括号 
    if(abs(up)>=down){                      //假分数 
        printf("%d",up/down);               //先打印整数部分 
        if(up%down)                         //如果不是整数,打印分数部分,一定要分子求绝对值 
            printf(" %d/%d",abs(up)%down,down);
    }
    else
        printf("%d/%d",up%down,down);       //真分数直接打印 
    if(up<0) putchar(')');                  //负数括号配对 
}
int main(void)
{
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt","r",stdin);
#endif
    FEN a,b,temp;
    scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);
    yuefen(&a); yuefen(&b);
    
    temp.down=a.down*b.down;                //加法 
    temp.up=a.up*b.down+a.down*b.up;
    yuefen(&temp);                          //算完后要化简 
    print_fen(&a);printf(" + ");print_fen(&b);printf(" = ");print_fen(&temp);putchar('\n');
    
    temp.up=a.up*b.down-a.down*b.up;        //减法,只是分子需要重新计算 
    yuefen(&temp);
    print_fen(&a);printf(" - ");print_fen(&b);printf(" = ");print_fen(&temp);putchar('\n');
    
    temp.up=a.up*b.up;                      //乘法,只是分子需要重新计算 
    yuefen(&temp);
    print_fen(&a);printf(" * ");print_fen(&b);printf(" = ");print_fen(&temp);putchar('\n');
    
    if(b.up==0){                            //如果除0,特殊判定 
        print_fen(&a);printf(" / ");putchar('0');printf(" = ");printf("Inf");putchar('\n');
    }
    else{
        temp.down=a.down*b.up;              //除法运算 
        temp.up=a.up*b.down;
        if(temp.down<0){                    //保证分子带正负号,分母总为正数 
            temp.down=-temp.down;
            temp.up=-temp.up;
        }
        yuefen(&temp);                      //约分并打印结果 
        print_fen(&a);printf(" / ");print_fen(&b);printf(" = ");print_fen(&temp);putchar('\n');
    }
    return 0;
}