PAT (Basic Level) Practice (中文) B1034 有理數四則運算 (20 分)(C++)(分數四則運算)

1034 有理數四則運算 (20 分)
本題要求編寫程序,計算 2 個有理數的和、差、積、商。

輸入格式:

輸入在一行中按照 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

using namespace std;
#include<algorithm>
#include<iostream>
#include<cstdio>

typedef struct Fraction//分數結構體
{
    long long int up, down;//分子分母
}Fraction;
Fraction A, B;

long long int gcd(long long int a, long long int b)//求最大公約數
{
    if(!b) return a;
    return gcd(b, a%b);
}

Fraction reduction(Fraction X)//化簡
{
    if(X.down < 0) X.up = -X.up, X.down = -X.down;
    if(!X.up) X.down = 1;
    else
    {
        long long int d = gcd(abs(X.up), abs(X.down));
        X.up /= d, X.down /= d;
    }
    return X;
}

void print_X(Fraction X)//打印某有理數
{
    X = reduction(X);
    if(!X.up) printf("0");
    else if(X.down == 1)
    {
        if(X.up < 0) printf("(%lld)", X.up);
        else printf("%lld", X.up);
    }
    else if(abs(X.up) > X.down)//假分數
    {
        if(X.up < 0)
        {
            printf("(%lld %lld/%lld)", X.up/X.down, abs(X.up%X.down), X.down);
        }
        else
        {
            printf("%lld %lld/%lld", X.up/X.down, X.up%X.down, X.down);
        }
    }
    else
    {
        if(X.up < 0) printf("(%lld/%lld)", X.up, X.down);
        else printf("%lld/%lld", X.up, X.down);
    }
}

void print(Fraction A, char ch, Fraction B)//打印有理數1 運算符 有理數2 = 
{
    print_X(A);
    printf(" %c ", ch);
    print_X(B);
    printf(" = ");
}

void print_result(Fraction R)//打印運算結果和回車
{
    print_X(R);
    printf("\n");
}

Fraction ADD(Fraction A, Fraction B)//加減乘除
{
    Fraction result;
    result.down = A.down*B.down;
    result.up = A.up*B.down + A.down*B.up;
    return result;
}
Fraction MINUS(Fraction A, Fraction B)
{
    Fraction result;
    result.down = A.down*B.down;
    result.up = A.up*B.down - A.down*B.up;
    return result;
}
Fraction MULTIPLY(Fraction A, Fraction B)
{
    Fraction result;
    result.down = A.down*B.down;
    result.up = A.up*B.up;
    return result;
}
Fraction DIVIDE(Fraction A, Fraction B)
{
    Fraction result;
    result.down = A.down*B.up;
    result.up = A.up*B.down;
    return result;
}


int main()
{
    scanf("%lld/%lld %lld/%lld", &A.up, &A.down, &B.up, &B.down);
    print(A, '+', B);
    print_result(ADD(A, B));
    print(A, '-', B);
    print_result(MINUS(A, B));
    print(A, '*', B);
    print_result(MULTIPLY(A, B));
    print(A, '/', B);
    if(!reduction(B).up) printf("Inf\n");//除數爲0單獨考慮
    else print_result(DIVIDE(A, B));
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章