zoukankan      html  css  js  c++  java
  • B1034 有理数四则运算

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


    由于思路不对,一开始将代码写得很复杂(写了200行),却还是有部分用例始终通不过。后来参看了别人的代码,整理了一下思路后重新,很顺利的写出来了。

    参看的大神的代码网址为:https://www.cnblogs.com/asheng2016/p/7979386.html

    我的代码如下:
    #include <iostream>
    using namespace std;
    
    int gcd(long a, long b){
        if(b==0){
            return a;
        }else{
            gcd(b, a%b);
        }
    } 
    
    void toPrintf(long a, long b){
        if(b==0){
            printf("Inf");
            return ;
        }
        if(a==0){
            printf("0");
            return ;
        }
        int flag = 1; //flag为1表示正数
        if(a<0) {
            a = 0 - a;
            flag *= (-1);
        }
        if(b<0){
            b = 0 - b;
            flag *= -1;
        }
        long a_b = gcd(a, b); //求最大公约数 
        a /= a_b;
        b /= a_b;
        if(flag<0){
            printf("(-");
        }
        if(b==1){ //整数 
            printf("%ld", a);
        }else if(a/b==0){ //a/b为0时,不输出 
            printf("%ld/%ld", a, b);
        }else{
            printf("%ld %ld/%ld", a/b, a%b, b);
        }
        if(flag<0){
            printf(")");
        }
    }
    
    int main(){
        long a1, b1, a2, b2;
        char c[4]={'+', '-', '*', '/'};
        scanf("%ld/%ld %ld/%ld", &a1, &b1, &a2, &b2);
        for(int i=0; i<4; i++){
            toPrintf(a1, b1);
            printf(" %c ", c[i]);
            toPrintf(a2, b2);
            printf(" = ");
            switch(c[i]){
                case '+':
                    toPrintf(a1*b2+a2*b1, b1*b2);
                    break;
                case '-':
                    toPrintf(a1*b2-a2*b1, b1*b2);
                    break;
                case '*':
                    toPrintf(a1*a2, b1*b2);
                    break;
                case '/':
                    toPrintf(a1*b2, b1*a2);
                    break;
            }
            printf("
    ");
        }
        return 0;
    }

    启示一:输入的形式为   2/3 -4/2

    对应的接收数据的代码形式为:

    scanf("%ld/%ld %ld/%ld", &a1, &b1, &a2, &b2);

    于是,很顺利的将数据存入long型变量中了。

    启示二:巧妙的将+、-、*、/ 四种操作定义在char数组中,从而用一个for循环很轻松的解决了四种操作。

    启示三:求最大公约数时,最好先将a,b化成正数,并用一个变量来记录a/b的正负,从而将(a, b)的四种情况,即:(+,+),(-, +),(+, -),(-, -)化简成了(+,+)这一种情况。

  • 相关阅读:
    java 获取最近三个月的月初和月末日期
    java 字符串与十六进制互转
    @Validated 参数校验及配置
    mybatis 存取Oracle数据库中Blob类型数据
    Java下载服务器文件到前端
    Java实现Oracle拷贝数据插入到MySQL
    保利、绿地用移动质检3.0管进度、质量,让快周转又快又好!
    未造先知,匠心协同-BIM全过程总咨询实践案例赏析-2021版
    大数据资产管理总体框架概述
    “数据资产全生命周期管理”你要知道的九大问题
  • 原文地址:https://www.cnblogs.com/heyour/p/12222051.html
Copyright © 2011-2022 走看看