首页 > 试题广场 >

有理数四则运算(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)
input_n,input_m = input().split(' ')
n_a,n_b = map(eval,input_n.split('/'))
m_a,m_b = map(eval,input_m.split('/'))
def gongyuefen_func(n_a,n_b,m_a,m_b):
    n_anew = n_a*m_b
    n_bnew = n_b*m_b
    m_anew = m_a*n_b
    m_bnew = m_b*n_b
    return n_anew,n_bnew,m_anew,m_bnew
def yuefen_print_func(a,b): 
    s = 1
    d = min(abs(a),b)
    for k in range(1,d+1):
        if a%k == 0 and b%k == 0:
            s = k
    a_n = a//s
    b_n = b//s
    if a_n > 0:
        if b_n == 1:
            return str(a_n)
        if b_n != 1:
            if a_n>b_n:
                return str(a_n//b_n)+' '+str(a_n%b_n)+'/'+str(b_n)
            if a_n<b_n:
                return str(a_n)+'/'+str(b_n)
    if a_n < 0:
        if b_n == 1:
            return '('+'-'+str(abs(a_n))+')'
        if b_n != 1:
            if abs(a_n)>b_n:
                return '('+'-'+str(abs(a_n)//b_n)+' '+str(abs(a_n)%b_n)+'/'+str(b_n)+')'
            if abs(a_n)<b_n:
                return '('+'-'+str(abs(a_n))+'/'+str(b_n)+')'
def jiafa_func(n_a,n_b,m_a,m_b):
    if n_a != 0 and m_a != 0:
        n_anew,n_bnew,m_anew,m_bnew = gongyuefen_func(n_a,n_b,m_a,m_b)
        new1 = n_anew + m_anew
        new2 = n_bnew
        if new1 == 0:
            return '0'
        elif new1 != 0:
            return yuefen_print_func(new1,new2)
def jianfa_func(n_a,n_b,m_a,m_b):
    if n_a != 0 and m_a != 0:
        n_anew,n_bnew,m_anew,m_bnew = gongyuefen_func(n_a,n_b,m_a,m_b)
        new1 = n_anew - m_anew
        new2 = n_bnew
        if new1 == 0:
            return '0'
        elif new1 != 0:
            return yuefen_print_func(new1,new2)
def chengfa_func(n_a,n_b,m_a,m_b):
    if n_a != 0 and m_a != 0:
        new1 = n_a*m_a
        new2 = n_b*m_b
        return yuefen_print_func(new1,new2)
def chufa_func(n_a,n_b,m_a,m_b):
    if n_a > 0 and m_a > 0:
        new1 = n_a*m_b
        new2 = n_b*m_a
    if n_a > 0 and m_a < 0:
        new1 = -n_a*m_b
        new2 = -n_b*m_a
    if n_a < 0 and m_a > 0:
        new1 = n_a*m_b
        new2 = n_b*m_a
    if n_a < 0 and m_a < 0:
        new1 = -n_a*m_b
        new2 = -n_b*m_a
    return yuefen_print_func(new1,new2)
if n_a != 0 and m_a != 0:
    num_n = yuefen_print_func(n_a,n_b)
    num_m = yuefen_print_func(m_a,m_b)
    num_jia = jiafa_func(n_a,n_b,m_a,m_b)
    num_jian = jianfa_func(n_a,n_b,m_a,m_b)
    num_cheng = chengfa_func(n_a,n_b,m_a,m_b)
    num_chu = chufa_func(n_a,n_b,m_a,m_b)
    print('{} + {} = {}'.format(num_n,num_m,num_jia))
    print('{} - {} = {}'.format(num_n,num_m,num_jian))
    print('{} * {} = {}'.format(num_n,num_m,num_cheng))
    print('{} / {} = {}'.format(num_n,num_m,num_chu))
if n_a == 0 and m_a != 0:
    num_n = 0
    num_m = yuefen_print_func(m_a,m_b)
    print('{} + {} = {}'.format(num_n,num_m,num_m))
    print('{} - {} = {}{}{}'.format(num_n,num_m,'(','-'+num_m,')'))
    print('{} * {} = {}'.format(num_n,num_m,'0'))
    print('{} / {} = {}'.format(num_n,num_m,'0'))
if n_a != 0 and m_a == 0:
    num_n = yuefen_print_func(n_a,n_b)
    num_m = 0
    print('{} + {} = {}'.format(num_n,num_m,num_n))
    print('{} - {} = {}'.format(num_n,num_m,num_n))
    print('{} * {} = {}'.format(num_n,num_m,'0'))
    print('{} / {} = {}'.format(num_n,num_m,'Inf'))
编辑于 2020-05-08 14:15:07 回复(0)
tmp1,tmp2 = input().split()
a1,b1 = map(int,tmp1.split('/'))
a2,b2 = map(int,tmp2.split('/'))
def Simplified(a,b):
    if a == 1:
        return a,b
    else:
        for i in range(2,a+1):
            if a%i==0 and b%i==0:
                a,b = Simplified(a//i,b//i)
        return a,b

def MixedFraction(a,b):
    output = ''
    fraction = ''
    if b < 0:
        b = - b
        a = - a
    if b == 0:
        return output
    else:
        Int = abs(a) // b
        Mod = abs(a) % b
        Mod,b = Simplified(Mod,b)
        if Mod != 0:
            fraction = str(Mod)+'/'+str(b)
        if Int != 0 and Mod != 0:
            output = str(Int) + ' ' + fraction
        elif Int == 0 and Mod != 0:
            output = fraction
        elif Int != 0 and Mod == 0:
            output = str(Int)
        else:
            output = '0'
        if a < 0 :
            output = '(-' + output + ')'
        return output
suma,sumb = a1*b2+a2*b1,b1*b2
suba,subb = a1*b2-a2*b1,b1*b2
mula,mulb = a1*a2,b1*b2
diva,divb = a1*b2,b1*a2
print(MixedFraction(a1,b1)+' + '+MixedFraction(a2,b2)+' = '+MixedFraction(suma,sumb))
print(MixedFraction(a1,b1)+' - '+MixedFraction(a2,b2)+' = '+MixedFraction(suba,subb))
print(MixedFraction(a1,b1)+' * '+MixedFraction(a2,b2)+' = '+MixedFraction(mula,mulb))
if divb == 0:
    print(MixedFraction(a1,b1)+' / '+MixedFraction(a2,b2)+' = Inf')
else:
    print(MixedFraction(a1,b1)+' / '+MixedFraction(a2,b2)+' = '+MixedFraction(diva,divb))

发表于 2019-03-26 10:08:06 回复(0)
def conven(a,b):         #将分母分子转换成标准形式(k a/b)
    divNum = simplify(abs(a),b)
    a //= divNum
    b //= divNum
    if a == 0:
        return '0'
    elif a < 0:
        a = abs(a)
        if a < b:
            return '(-%d/%d)' % (a, b)
        c,d = divmod(a,b)
        if d == 0:
            return '(-%d)' % (c)
        return '(-%d %d/%d)' % (c, d, b)
    elif a >= b:
        c,d = divmod(a,b)
        if d == 0:
            return '%d' % (c)
        return '%d %d/%d'%(c,d,b)
    else:
        return '%d/%d' % (a,b)
def simplify(a,b):           #求最大公因子
    while b: 
        a,b = b,a%b
    return a

while True:
    try:
        a,b = input().split()
        a = list(map(int,a.split('/')))
        b = list(map(int,b.split('/')))
        leftA = conven(a[0],a[1])
        leftB = conven(b[0],b[1])
        print('%s + %s = %s' % (leftA,leftB,conven(a[0]*b[1]+b[0]*a[1],a[1]*b[1])))
        print('%s - %s = %s' % (leftA,leftB,conven(a[0]*b[1]-b[0]*a[1],a[1]*b[1])))
        print('%s * %s = %s' % (leftA,leftB,conven(a[0]*b[0],a[1]*b[1])))
        if b[0] == 0:
            print('%s / %s = %s' % (leftA,leftB,'Inf'))
        else:
            print('%s / %s = %s' % (leftA,leftB,conven(a[0]*b[1],a[1]*b[0])))
    except Exception:
        break
编辑于 2018-10-14 00:51:43 回复(0)

问题信息

难度:
3条回答 20038浏览

热门推荐

通过挑战的用户