zoukankan      html  css  js  c++  java
  • 分数的四则运算与化简输出

    表示分数的结构体
    // 分数结构体
    struct Fraction{
        long long up, down;        // 分子和分母,由于分数的乘法和除法可能使分子或分母超过int型表示范围,因此一般情况下,分子和分母应当使用long long 型来存储
    };

    分数的化简:

    化简规则:(1)如果分子up为0, 令分母为1

         (2)约分,求出分子和分母的最大公约数,然后令分子和分母同时除以这个数

         (3)如果分母为负数,令分子up和分母down都变为相反数

    // 求最大公约数的函数
    long long gcd(long long a, long long b){
        return !b ? a : gcd(b, a % b);
    }
    // 分数的化简
    Fraction reduction(Fraction result){
        // 如果分子up为0, 令分母为1
        if (result.up == 0){
            result.down = 1;
        }
        else{
            // 约分,求出分子和分母的最大公约数,然后令分子和分母同时除以这个数
            long long d = gcd(abs(result.up), abs(result.down));
            result.up /= d;
            result.down /= d;
        }
    
        // 如果分母为负数,令分子up和分母down都变为相反数
        if (result.down < 0){
            result.down = (-1) * result.down;
            result.up = (-1) * result.up;
        }
        return result;
    }

    分数的加法:

    // 分数的加法
    Fraction add(Fraction f1, Fraction f2){
        Fraction result;
        result.up = f1.up * f2.down + f2.up * f1.down;
        result.down = f1.down * f2.down;
        return result;
    }

    分数的减法:

    // 分数的减法
    Fraction minus(Fraction f1, Fraction f2){
        Fraction result;
        result.down = f1.down * f2.down;
        result.up = f1.up * f2.down - f2.up * f1.down;
        return result;
    }

    分数的乘法:

    // 分数的乘法
    Fraction multi(Fraction f1, Fraction f2){
        Fraction result;
        result.up = f1.up * f2.up;
        result.down = f1.down * f2.down;
        return result;
    }

    分数的除法:(除数是否为0放在函数外部判断)

    // 分数的除法
    Fraction divide(Fraction f1, Fraction f2){
        Fraction result;
        result.up = f1.up * f2.down;
        result.down = f1.down * f2.up;
        return result;
    }

    分数的格式输出:

    (1)分母为1则输出整数

    (2)分子的绝对值大于分母则输出带假分数的形式

    (3)真分数直接输出

    // 分数的输出
    void showResult(Fraction r){
        // 输出前化简
        r = reduction(r);
        // 分母为1则输出整数
        if (r.down == 1){
            printf("%lld", r.up);
        }
        else if(abs(r.up) > r.down){
            // 分子的绝对值大于分母则输出带假分数的形式
            printf("%lld %lld/%lld", r.up / r.down, abs(r.up) % r.down, r.down);
        }
        else{
            // 真分数直接输出
            printf("%lld/%lld", r.up, r.down);
        }
    
    }

    题目实战:

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

    代码:

      1 // 分数的四则运算
      2 #include <stdio.h>
      3 #include <algorithm>
      4 
      5 // 分数结构体
      6 struct Fraction{
      7     long long up, down;        // 分子和分母,由于分数的乘法和除法可能使分子或分母超过int型表示范围,因此一般情况下,分子和分母应当使用long long 型来存储
      8 };
      9 
     10 // 求最大公约数的函数
     11 long long gcd(long long a, long long b){
     12     return !b ? a : gcd(b, a % b);
     13 }
     14 
     15 // 分数的化简
     16 Fraction reduction(Fraction result){
     17     // 如果分母为负数,令分子up和分母down都变为相反数
     18     if (result.down < 0){
     19         result.down = (-1) * result.down;
     20         result.up = (-1) * result.up;
     21     }
     22     // 如果分子up为0, 令分母为1
     23     if (result.up == 0){
     24         result.down = 1;
     25     }
     26     else{
     27         // 约分,求出分子和分母的最大公约数,然后令分子和分母同时除以这个数
     28         long long d = gcd(abs(result.up), abs(result.down));
     29         result.up /= d;
     30         result.down /= d;
     31     }
     32     return result;
     33 }
     34 
     35 // 分数的加法
     36 Fraction add(Fraction f1, Fraction f2){
     37     Fraction result;
     38     result.up = f1.up * f2.down + f2.up * f1.down;
     39     result.down = f1.down * f2.down;
     40     return reduction(result);
     41 }
     42 
     43 // 分数的减法
     44 Fraction minus(Fraction f1, Fraction f2){
     45     Fraction result;
     46     result.down = f1.down * f2.down;
     47     result.up = f1.up * f2.down - f2.up * f1.down;
     48     return reduction(result);
     49 }
     50 
     51 // 分数的乘法
     52 Fraction multi(Fraction f1, Fraction f2){
     53     Fraction result;
     54     result.up = f1.up * f2.up;
     55     result.down = f1.down * f2.down;
     56     return reduction(result);
     57 }
     58 
     59 // 分数的除法
     60 Fraction divide(Fraction f1, Fraction f2){
     61     Fraction result;
     62     result.up = f1.up * f2.down;
     63     result.down = f1.down * f2.up;
     64     return reduction(result);
     65 }
     66 
     67 // 分数的输出
     68 void showResult(Fraction r){
     69     // 输出前化简
     70     r = reduction(r);
     71     if (r.up < 0){        // 输出左括号
     72         printf("(");
     73     }
     74     // 分母为1则输出整数
     75     if (r.down == 1){
     76         printf("%lld", r.up);
     77     }
     78     else if(abs(r.up) > r.down){
     79         // 分子的绝对值大于分母则输出带假分数的形式
     80         printf("%lld %lld/%lld", r.up / r.down, abs(r.up) % r.down, r.down);
     81     }
     82     else{
     83         // 真分数直接输出
     84         printf("%lld/%lld", r.up, r.down);
     85     }
     86     if (r.up < 0){        // 输出右括号
     87         printf(")");
     88     }
     89 }
     90 
     91 int main()
     92 {
     93     // 读取输入
     94     freopen("in.txt", "r", stdin);
     95     Fraction a, b, result;
     96     scanf("%lld/%lld %lld/%lld", &a.up, &a.down, &b.up, &b.down);
     97     // 计算和然后输出
     98     showResult(a);
     99     printf(" + ");
    100     showResult(b);
    101     printf(" = ");
    102     result = add(a, b);
    103     showResult(result);
    104     printf("
    ");
    105 
    106     // 计算差然后输出
    107     result = minus(a, b);
    108     showResult(a);
    109     printf(" - ");
    110     showResult(b);
    111     printf(" = ");
    112     showResult(result);
    113     printf("
    ");
    114 
    115     // 计算积然后输出
    116     result = multi(a, b);
    117     showResult(a);
    118     printf(" * ");
    119     showResult(b);
    120     printf(" = ");
    121     showResult(result);
    122     printf("
    ");
    123 
    124     // 计算商然后输出
    125     showResult(a);
    126     printf(" / ");
    127     showResult(b);
    128     printf(" = ");
    129     if (b.up == 0){
    130         printf("Inf");
    131     }
    132     else{
    133         result = divide(a, b);
    134         showResult(result);
    135     }
    136 
    137     fclose(stdin);
    138     return 0;
    139 }
  • 相关阅读:
    设计模式-观察者模式(Observer Pattern)
    设计模式-策略模式(Strategy Pattern)
    数据结构-红黑树
    数据结构-二叉搜索树(BST binary search tree)
    算法-插入排序(Insertion sorting)
    算法-桶排序(Bucket sort)
    设计模式-单例模式(Singleton Pattern)
    算法-基数排序(radix sort)
    算法-计数排序及其变体
    Pytest框架的使用
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/12228892.html
Copyright © 2011-2022 走看看