ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

分数的四则运算与化简输出

2021-05-29 23:51:30  阅读:278  来源: 互联网

标签:化简 分数 f2 f1 四则运算 up down result Fraction


表示分数的结构体
// 分数结构体
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);
    }

}

 

题目实战:

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

本题要求编写程序,计算 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("\n");
105 
106     // 计算差然后输出
107     result = minus(a, b);
108     showResult(a);
109     printf(" - ");
110     showResult(b);
111     printf(" = ");
112     showResult(result);
113     printf("\n");
114 
115     // 计算积然后输出
116     result = multi(a, b);
117     showResult(a);
118     printf(" * ");
119     showResult(b);
120     printf(" = ");
121     showResult(result);
122     printf("\n");
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 }

标签:化简,分数,f2,f1,四则运算,up,down,result,Fraction
来源: https://blog.51cto.com/u_14201949/2832236

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有