首页 > 试题广场 >

有理数四则运算(20)

[编程题]有理数四则运算(20)
  • 热度指数:9966 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
本题要求编写程序,计算2个有理数的和、差、积、商。

输入描述:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分
母不为0。


输出描述:
分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的
最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中
没有超过整型范围的整数。
示例1

输入

5/3 0/6

输出

1 2/3 + 0 = 1 2/3<br/>1 2/3 - 0 = 1 2/3<br/>1 2/3 * 0 = 0<br/>1 2/3 / 0 = Inf
推荐
啥头像
总体思路:
    模拟小学有理数的运算,注意约分和输出格式
注意点:
   所有输出均转换为真分式形式
   负号的位置,负号在括号内,不是在括号外。    (-1 1/3)
   整数部分为0时不输出整数部分,真分式部分为0时也不输出

代码如下:
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <sstream>

using namespace std;

long long greatestCommonDivisor(long long a, long long b);
string getProperFraction(long long num, long long den);

int main()
{
    // 提取分数的两部分
    string fraction1, fraction2;
    cin >> fraction1 >> fraction2;
    long long num1, den1, num2, den2;
    int nPos = fraction1.find('/');
    num1 = atoi((fraction1.substr(0, nPos)).c_str());
    den1 = atoi((fraction1.substr(nPos+1)).c_str());
    nPos = fraction2.find('/');
    num2 = atoi((fraction2.substr(0, nPos)).c_str());
    den2 = atoi((fraction2.substr(nPos+1)).c_str());

    // 四则运算
    string first = getProperFraction(num1, den1);
    string second = getProperFraction(num2, den2);
        // +
    long long num = num1*den2 + num2*den1;
    long long den = den1*den2;
    string third = getProperFraction(num, den);
    cout << first << " + " << second << " = " << third << endl;
        // -
    num = num1*den2 - num2*den1;
    third = getProperFraction(num, den);
    cout << first << " - " << second << " = " << third << endl;
        // *
    num = num1*num2; den = den1*den2;
    third = getProperFraction(num, den);
    cout << first << " * " << second << " = " << third << endl;
        // /
    num = num1*den2; den = den1*num2;
    if(den == 0) {
        cout << first << " / " << second << " = Inf" << endl;
    } else {
        third = getProperFraction(num, den);
        cout << first << " / " << second << " = " << third << endl;
    }

    return 0;
}

string getProperFraction(long long num, long long den)
{
    // 基本边界、基本变量
    if(num == 0) {
        return "0";
    }
    bool isMinus = false;
    string str = "";
    if(num*den < 0) {
        isMinus = true; num = abs(num);
        den = abs(den); str = "(-";
    }

    //约分
    long long gcd = greatestCommonDivisor(num, den);
    num /= gcd; den /= gcd;
    stringstream ss; ss << (num/den);
    string intPart, fracPart;
    ss >> intPart;
    stringstream ss2; ss2 << (num%den);
    ss2 >> fracPart;
    if((num/den)>0) {
        str += intPart;
    }
    if((num%den)>0) {
        if((num/den)>0) {
            str += " ";
        }
        str += fracPart; str += '/';
        stringstream ss3; string temp;
        ss3 << den; ss3 >> temp;
        str += temp;
    }
    if(isMinus) {
        str += ')';
    }
    return str;
}

long long greatestCommonDivisor(long long a, long long b)
{
    long long c;
    while (b != 0) {
        c = a % b;
        a = b;
        b = c;
    }
    return a;
} 


编辑于 2016-04-12 22:55:21 回复(1)