PAT 1034. 有理数四则运算

PAT 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

分析

自己写的程序如下,测试点2未过,如有大神路过,请指点一二,万分感谢

自己的代码

#include<iostream>
#include<math.h>
using namespace std;
long long int inf=0,flag3=1,int3,son3,mom3;
void print(long long int flag,long long int Int,long long int son,long long int mom){
    if(inf==1){
    cout<<"Inf"; return;
    }
    if(flag==0)
    cout<<0;
    else if(flag<0){
    if(Int==0)
    cout<<"("<<-son<<"/"<<mom<<")";
    else if(Int!=0&&son!=0)
    cout<<"("<<-Int<<" "<<son<<"/"<<mom<<")";
    else
    cout<<"("<<-Int<<")";
    }
    else if(flag>0){
    if(Int==0) cout<<son<<"/"<<mom;
    else if(Int!=0&&son!=0)cout<<Int<<" "<<son<<"/"<<mom;
    else cout<<Int;
    }
    flag3=1;
}
long long int gcd(long long int t1,long long int t2) {
    return t2 == 0 ? t1 : gcd(t2, t1 % t2);
}
void huajian(long long int &son,long long int &mom,long long int &Int,long long int &flag){
    long long int s=abs(son);
    long long int temp=gcd(s,mom);
    son/=temp; mom/=temp;
    if(son<0) {flag=-1; son=-son;}
    else if(son==0) flag=0;
    Int=son/mom; son=son%mom;
}
void jia(long long int s1,long long int m1,long long int s2,long long int m2){
    mom3=m1*m2;
    son3=m1*s2+m2*s1;
}
void jian(long long int s1,long long int m1,long long int s2,long long int m2){
    mom3=m1*m2;
    son3=s1*m2-s2*m1;
}
void chen(long long int s1,long long int m1,long long int s2,long long int m2){
    mom3=m1*m2;
    son3=s1*s2;
}
void chu(long long int s1,long long int m1,long long int s2,long long int m2){
    if(s2==0) inf=1;
    else{
        son3=s1*m2;
        mom3=s2*m1;
    }
    if(son3*mom3>0) {son3=abs(son3); mom3=abs(mom3); }
    else if(son3*mom3<0){son3=-abs(son3); mom3=abs(mom3);}
}
int main(){
    long long int mom1,son1,int1,mom2,son2,int2,flag1=1,flag2=1;
    scanf("%lld/%lld %lld/%lld",&son1,&mom1,&son2,&mom2);
    char fuhao[4]={'+','-','*','/'};
    long long int m1=mom1,s1=son1,m2=mom2,s2=son2;
    huajian(son1,mom1,int1,flag1);
    huajian(son2,mom2,int2,flag2);
    for(int i=0;i<4;i++){
    print(flag1,int1,son1,mom1);
    cout<<" "<<fuhao[i]<<" ";
    print(flag2,int2,son2,mom2);
    cout<<" = ";
    switch(i){
        case 0:jia(s1,m1,s2,m2); break;
        case 1:jian(s1,m1,s2,m2); break;
        case 2:chen(s1,m1,s2,m2); break;
        case 3:chu(s1,m1,s2,m2); break;
        default:;
    }
    huajian(son3,mom3,int3,flag3);
    print(flag3,int3,son3,mom3);
    cout<<endl;
    }
    return 0;
} 

目前看过的本题最好的代码

#include <stdio.h>
long getgcd(long a, long b);
void printfrac(long a, long b);
int main (void) {
    long a1;
    long b1;
    long a2;
    long b2;
    char op[4] = {'+', '-', '*', '/'};
    int i;
    scanf("%ld/%ld %ld/%ld", &a1, &b1, &a2, &b2);
    for(i = 0; i < 4; i++) {
        printfrac(a1, b1);
        printf(" %c ", op[i]);
        printfrac(a2, b2);
        printf(" = ");
        switch (op[i]) {
            case '+':
                printfrac(a1 * b2 + a2 * b1, b1 * b2);
                break;
            case '-':
                printfrac(a1 * b2 - a2 * b1, b1 * b2);
                break;
            case '*':
                printfrac(a1 * a2, b1 * b2);
                break;
            case '/':
                printfrac(a1 * b2, b1 * a2);
                break;
        }
        printf("\n");
    }
    return 0;
}
long getgcd(long t1,long t2) { // 辗转相除求最大公因子
    return t2 == 0 ? t1 :getgcd(t2, t1 % t2);
}
void printfrac (long a, long b) {
    if (b == 0) {
        printf("Inf");
        return;
    }
    int sign = 1;
    long gcd;
    if (a < 0) {
        a = -a;
        sign = sign * -1;
    }
    if (b < 0) {
        b = -b;
        sign = sign * -1;
    }
    gcd =getgcd(a, b);
    a = a / gcd;
    b = b / gcd;
    if (sign == -1) printf("(-");
    if (b == 1) {
        printf("%ld", a);
    } else if (a > b) {
        printf("%ld %ld/%ld", a / b, a % b, b);
    } else {
        printf("%ld/%ld", a, b); // a < b
    }
    if (sign == -1) printf(")");
}

原文地址:https://www.cnblogs.com/A-Little-Nut/p/8111501.html

时间: 2024-10-10 08:27:16

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

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

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

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

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

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 IO-02 整数四则运算

1 /* 2 *PAT IO-02 整数四则运算 3 *2015-07-30 4 *作者:flx413 5 */ 6 7 #include<stdio.h> 8 int main() 9 { 10 int a, b; 11 scanf("%d%d", &a, &b); 12 printf("%d + %d = %d\n", a, b, a + b); 13 printf("%d - %d = %d\n", a, b,

有理数四则运算的实验报告小结

一.实验报告内容: 设计抽象数据类型有理数的描述 (有理数是其分子.分母均为整数且分母不为零的分数). 有理数主要数据运算有: 1.       构造有理数T,元素e1,e2分别被赋以分子.分母值 2.       销毁有理数T 3.       用e返回有理数T的分子或分母,i=1返回分子, i=2返回分母. 4.       改变有理数T的分子或分母为e,i=1改变分子, i=2改变分母 5.       有理数T1,T2相加,结果存入有理数T3 6.       有理数T1,T2相减,结果

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

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

PAT 1034 Head of a Gang[难]

1034 Head of a Gang (30)(30 分) One way that the police finds the head of a gang is to check people's phone calls. If there is a phone call between A and B, we say that A and B is related. The weight of a relation is defined to be the total time lengt