PAT-BASIC-1034-有理数四则运算

本题要求编写程序,计算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

这题WA了好久,卡在LL这里......大致思路就是通分之后要约分,然后将约分之后的这个数转成一个真分数的形式

//ll WA
#include <bits/stdc++.h>
#define LL long long
using namespace std;

void convert(LL a, LL b);
int  main(){
    LL a1, b1, a2, b2;
    scanf("%lld/%lld%lld/%lld", &a1, &b1, &a2, &b2);
    //+
    convert(a1, b1);
    printf(" + ");
    convert(a2, b2);
    printf(" = ");
    convert(a1*b2+a2*b1, b1*b2);
    printf("\n");
    //-
    convert(a1, b1);
    printf(" - ");
    convert(a2, b2);
    printf(" = ");
    convert(a1*b2-a2*b1, b1*b2);
    printf("\n");
    //*
    convert(a1, b1);
    printf(" * ");
    convert(a2, b2);
    printf(" = ");
    convert(a1*a2, b1*b2);
    printf("\n");
    // /
    convert(a1, b1);
    printf(" / ");
    convert(a2, b2);
    printf(" = ");
    if(a2 == 0){
        printf("Inf\n");
    }
    else{
        convert(a1*b2, a2*b1);
        printf("\n");
    }
    return 0;
}
void convert(LL a, LL b){
    if(a > 0 && b < 0){
        a = -a;
        b = -b;
    }
    else if(a < 0 && b < 0){
        a = -a;
        b = -b;
    }
    // a = b*k
    if(a % b == 0){
        if(a < 0){
            printf("(%lld)", a/b);
        }
        else{
            printf("%lld", a/b);
        }
        return;
    }
    //otherwise
    //simplify
    for(int i = 2; i <= sqrt(max(a,b)); ++i){
        while(a % i == 0 && b % i == 0){
            a /= i;
            b /= i;
        }
    }
    if(a < 0){
        //-
        if(a / b != 0){
            printf("(%lld %lld/%lld)", a/b, (abs(a))%b, b);
        }
        else{
            printf("(%lld/%lld)", a, b);
        }
    }
    else{
        //+
        if(a / b != 0){
            printf("%lld %lld/%lld", a/b, a%b, b);
        }
        else{
            printf("%lld/%lld", a, b);
        }
    }
}

CAPOUIS‘CODE

时间: 2024-10-07 02:58:28

PAT-BASIC-1034-有理数四则运算的相关文章

PAT乙级1034. 有理数四则运算(20)

本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0. 输出格式: 分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和.差.积.商.注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分:若为负数,则须加括号:若除法分母为0,则输出“Inf”.题目保证正确的输出中没

PAT 1034. 有理数四则运算

PAT 1034. 有理数四则运算 本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0. 输出格式: 分别在4行中按照"有理数1 运算符 有理数2 = 结果"的格式顺序输出2个有理数的和.差.积.商.注意输出的每个有理数必须是该有理数的最简形式"k a/b",其中k是整数部分,a/b是最简分

PAT-乙级-1034. 有理数四则运算(20)

1034. 有理数四则运算(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0. 输出格式: 分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和.差.积.商.注意输出

PAT Basic 1034

1034 有理数四则运算 本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0. 输出格式: 分别在4行中按照"有理数1 运算符 有理数2 = 结果"的格式顺序输出2个有理数的和.差.积.商.注意输出的每个有理数必须是该有理数的最简形式"k a/b",其中k是整数部分,a/b是最简分数部分:若

1034. 有理数四则运算(20)

本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0. 输出格式: 分别在4行中按照"有理数1 运算符 有理数2 = 结果"的格式顺序输出2个有理数的和.差.积.商.注意输出的每个有理数必须是该有理数的最简形式"k a/b",其中k是整数部分,a/b是最简分数部分:若为负数,则须加括号:若除法

PAT-B 1034. 有理数四则运算

题目内容: 本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0. 输出格式: 分别在4行中按照"有理数1 运算符 有理数2 = 结果"的格式顺序输出2个有理数的和.差.积.商.注意输出的每个有理数必须是该有理数的最简形式"k a/b",其中k是整数部分,a/b是最简分数部分:若为负数,则须加

PAT1034 有理数四则运算 (20分)

1034 有理数四则运算 (20分) 本题要求编写程序,计算 2 个有理数的和.差.积.商. 输入格式: 输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0. 输出格式: 分别在 4 行中按照 有理数1 运算符 有理数2 = 结果 的格式顺序输出 2 个有理数的和.差.积.商.注意输出的每个有理数必须是该有理数的最简形式 k a/b,其中 k 是整数部分,a/b 是最简分数部分:若为负数,则须加括号:

PAT (Basic Level) Practise (中文) 1005

1005. 继续(3n+1)猜想 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对n=3进行验证的时候,我们需要计算3.5.8.4.2.1,则当我们对n=5.8.4.2进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重

PAT (Basic Level) Practise (中文)1004. 成绩排名 (20)

读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生的姓名 学号 成绩 ... ... ... 第n+1行:第n个学生的姓名 学号 成绩 其中姓名和学号均为不超过10个字符的字符串,成绩为0到100之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的. 输出格式:对每个测试用例输出2行,第1行是成绩最高学生的姓名和学号,第2行是成绩最低

PAT Basic 1057 数零壹 (20 分)

给定一串长度不超过 1 的字符串,本题要求你将其中所有英文字母的序号(字母 a-z 对应序号 1-26,不分大小写)相加,得到整数 N,然后再分析一下 N 的二进制表示中有多少 0.多少 1.例如给定字符串 PAT (Basic),其字母序号之和为:16+1+20+2+1+19+9+3=71,而 71 的二进制是 1000111,即有 3 个 0.4 个 1. 输入格式: 输入在一行中给出长度不超过 1.以回车结束的字符串. 输出格式: 在一行中先后输出 0 的个数和 1 的个数,其间以空格分隔