您的位置:首页 > 其它

1034. 有理数四则运算

2016-02-14 20:59 204 查看
本题要求编写程序,计算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

算法:

算法开始。
分别读取四个数字。
进行加减乘除运算,得到结果。
将假分数化简为最简带分数,将真分数化为最简真分数。
输出加减乘除四个运算。除法,若除数为零,则结果为Inf。
算法结束。

注意:由于题目未限制整数大小,所以应该把分子、分母变量设为long long,即占8个字节。否则PAT上有的测试用例会出错。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 1000
typedef struct fraction{
    long long n;
    long long a;
    long long b;
} fraction;
fraction convert(fraction);
void print(fraction v3, char operator, fraction v4, fraction result);
void print_fraction(fraction v);
long long greatest_common_divisor(long long a, long long b);
int main(int argc, const char * argv[]) {
    fraction v1={0}, v2={0}, result={0}, v3={0}, v4={0};
    scanf("%lld/%lld %lld/%lld", &(v1.a), &(v1.b), &(v2.a), &(v2.b));
    result.a=v1.a*v2.b+v2.a*v1.b;
    result.b=v1.b*v2.b;
    result=convert(result);
    v3=convert(v1);
    v4=convert(v2);
    print(v3, '+', v4, result);
    putchar('\n');
    result.a=v1.a*v2.b-v2.a*v1.b;
    result.b=v1.b*v2.b;
    result=convert(result);
    print(v3, '-', v4, result);
    putchar('\n');
    result.a=v1.a*v2.a;
    result.b=v1.b*v2.b;
    result=convert(result);
    print(v3, '*', v4, result);
    putchar('\n');
    result.a=v1.a*v2.b;
    result.b=v1.b*v2.a;
    result=convert(result);
    print(v3, '/', v4, result);
    return 0;
}
fraction convert(fraction f){
    long long div=0;
    fraction tmp={0};
    if(f.a<0){
        tmp.a=-f.a;
    }
    else{
        tmp.a=f.a;
    }
    if(f.b<0){
        tmp.b=-f.b;
    }
    else{
        tmp.b=f.b;
    }
    if(tmp.a*tmp.b){
        div=greatest_common_divisor(tmp.a,tmp.b);
        tmp.a/=div;
        tmp.b/=div;
    }
    if(tmp.b){
        tmp.n=tmp.a/tmp.b;
        tmp.a=tmp.a%tmp.b;
        if((f.a>=0)^(f.b>=0)){
            if(tmp.n){
                tmp.n*=-1;
            }
            else{
                tmp.a*=-1;
            }
        }
    }
    else{
        tmp.n=0;
        tmp.a=0;
        tmp.b=0;
    }
    return tmp;
}

long long greatest_common_divisor(long long a, long long b){
    long long i;
    while(a%b!=0){
        i=a%b;
        a=b;
        b=i;
    }
    return b;
}
void print(fraction v3, char c, fraction v4, fraction result){
    print_fraction(v3);
    printf(" %c ", c);
    print_fraction(v4);
    printf(" = ");
    print_fraction(result);
    return ;
}
void print_fraction(fraction v){
    if(v.n<0){
        if(v.a==0){
            printf("(%lld)", v.n);
        }
        else{
            printf("(%lld %lld/%lld)", v.n, v.a, v.b);
        }
    }
    else if(v.n==0){
        if(v.a==0){
            if(v.b){
                printf("%lld", v.n);
            }
            else{
                printf("Inf");
            }
        }
        else if(v.a>0){
            printf("%lld/%lld", v.a, v.b);
        }
        else if(v.a<0){
            printf("(%lld/%lld)", v.a, v.b);
        }
    }
    else if(v.n>0){
        if(v.a==0){
            printf("%lld", v.n);
        }
        else if(v.a>0){
            printf("%lld %lld/%lld", v.n, v.a, v.b);
        }
    }
    return ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: