zoukankan      html  css  js  c++  java
  • 【算法笔记】B1034 有理数四则运算

    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 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 typedef long long ll;
     5 
     6 ll gcd(ll a, ll b){
     7     if(a%b==0) return b;       
     8     else gcd(b,a%b);
     9 }
    10 struct Fraction{
    11     ll up, down;
    12 }a, b;
    13 Fraction reduction(Fraction f){
    14     if(f.down < 0){
    15         f.up = -f.up;
    16         f.down = -f.down;
    17     }
    18     if(f.up == 0) f.down = 1;
    19     else{
    20         int d = gcd(abs(f.up), abs(f.down));
    21         f.up /= d;
    22         f.down /= d;
    23     }
    24     return f;
    25 }
    26 Fraction add(Fraction f1, Fraction f2){
    27     Fraction result;
    28     result.up = f1.up * f2.down + f1.down * f2.up;
    29     result.down = f1.down * f2.down;
    30     return result;
    31 }
    32 Fraction minu(Fraction f1, Fraction f2){
    33     Fraction result;
    34     result.up = f1.up * f2.down - f1.down * f2.up;
    35     result.down = f1.down * f2.down;
    36     return result;
    37 }
    38 Fraction multi(Fraction f1, Fraction f2){
    39     Fraction result;
    40     result.up = f1.up * f2.up;
    41     result.down = f1.down * f2.down;
    42     return result;
    43 }
    44 Fraction divide(Fraction f1, Fraction f2){
    45     Fraction result;
    46     result.up = f1.up * f2.down;
    47     result.down = f1.down * f2.up;
    48     return result;
    49 }
    50 void show(Fraction f){
    51     f = reduction(f);
    52     if(f.up < 0) printf("(");
    53     if(f.down == 1) printf("%lld",f.up);
    54     else if(abs(f.up) > abs(f.down)){
    55         printf("%lld %lld/%lld", f.up / f.down, abs(f.up) % f.down, f.down);
    56     }else{
    57         printf("%lld/%lld", f.up, f.down);
    58     }
    59     if(f.up < 0) printf(")");
    60 }
    61 void showResult(Fraction f1, Fraction f2, Fraction result, char sign){
    62     show(f1);
    63     cout<<" "<<sign<<" ";
    64     show(f2);
    65     cout<<" = ";
    66     if(result.down == 0) cout<<"Inf";
    67     else show(result);
    68     cout<<endl;
    69 }
    70 int main(){
    71     scanf("%lld/%lld %lld/%lld", &a.up, &a.down, &b.up, &b.down);
    72     showResult(a, b, add(a, b), '+');
    73     showResult(a, b, minu(a, b), '-');
    74     showResult(a, b, multi(a, b), '*');
    75     showResult(a, b, divide(a, b), '/');
    76     return 0;
    77 }
  • 相关阅读:
    Shell中 调用/引用/包含 另外的脚本文件的两种方法
    CentOS6.3安装MongoDB2.2 及 安装PHP的MongoDB客户端
    Linux下忘记MySQL的root密码的解决方法
    计算机图形学 椭圆的扫描转换(3)
    实现app上对csdn的文章查看,以及文章中图片的保存 (制作csdn app 完结篇)
    linux 查看并终止进程
    ios7自带的晃动效果
    HDU--1533--Going Home--KM算法
    C语言中怎么求动态数组大小
    myeclipse断点调试
  • 原文地址:https://www.cnblogs.com/chunlinn/p/10621683.html
Copyright © 2011-2022 走看看