PAT Basic 1034 有理数四则运算(20)

输入格式:

输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。

输出格式:

分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。

输入样例1:
2/3 -4/2
输出样例1:
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
输出样例2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

解题思路:这道题目的难点在于繁琐的数值转换,解决方法是将分出不同的函数模块,如处理最初输入的信息,将输入的信息转化为容易进行运算处理的整型;求出最大公约数将输出为“k a/b”的形式。
一,处理输入的数据:

void func1034(char x[5],char y[5]){
    char a[5], b[5];
    strcpy(a, x); strcpy(b, y);
    //pat basic 1034
    int ax, ay, bx, by;
    if (b[0] != '-'){
        bx = (int)b[0] - 48;
        by = (int)b[2] - 48;
    }
    else{
        bx = -1*((int)b[1] - 48);
        by = (int)b[3] - 48;
    }
    if (a[0] != '-'){
        ax = (int)a[0] - 48;
        ay = (int)a[2] - 48;
    }
    else{
        ax = -1*((int)a[1] - 48);
        ay = (int)a[3] - 48;
    }

二,求出最大公约数,让输出满足题目要求的输出格式

int gys = 0;
    for (int i = 1; i <= abs(fenZi)&&i <= abs(fenMu); ++i)
        if (fenZi%i == 0 && fenMu%i == 0)
            gys = i;
    if (abs(fenZi)>abs(fenMu)&&fenMu!=0){
        if (fenZi>0 && fenMu>0){
            cout << fenZi / fenMu << " ";
            cout << fenZi%fenMu / gys << "/" << fenMu / gys;
        }
        else if (fenZi < 0 || fenMu<0){
            cout << "(-" << abs(fenZi) / abs(fenMu )<< " ";
            cout << abs(fenZi) % abs(fenMu) / gys << "/" << abs(fenMu) / gys << ")";
        }
        else cout << "0";
    }
    else if (fenMu == 0)cout << "inf\n";
    else if (fenZi == 0 && fenMu != 0)cout << "0\n";
    else{
        if (fenZi>0&&fenMu>0){
            cout << fenZi / gys << "/" << fenMu / gys;
        }
        else if (fenZi < 0||fenMu<0){
            cout << "(-" << abs(fenZi) / gys << "/" << abs(fenMu) / gys << ")";
        }
    }
    cout << endl;

三,加减乘除运算

void add(int ax, int ay, int bx, int by){
    int fenZi = ax*by + bx*ay;
    int fenMu = ay*by;
    process(fenZi, fenMu);
}
void sub(int ax,int ay,int bx,int by){
    int fenZi = ax*by - bx*ay;
    int fenMu = ay*by;

    process(fenZi, fenMu);
}
void mult(int ax, int ay, int bx, int by){
    int fenZi = ax*bx;
    int fenMu = by*ay;
    process(fenZi, fenMu);
}
void div(int ax, int ay, int bx, int by){
    int fenZi = ax*by;
    int fenMu = ay*bx;
    process(fenZi, fenMu);
}

四,调用输出

cout << "+:"; add(ax, ay, bx, by);
    cout << "-:"; sub(ax, ay, bx, by);
    cout << "*:"; mult(ax, ay, bx, by);
    cout << "\:"; div(ax, ay, bx, by);

你可能感兴趣的:(刷题,日常)