pat 乙级1034

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


这一题挺有意思的,就是写代码的时候太烦,最后测试不知怎么回事总有一个不通过,先把代码保存下来以后慢慢看。
#include<bits/stdc++.h>
using namespace std; 
void outans(int a,int b)
{
    if(b==0)
    {
        cout<<"Inf";return;
    }else if(a==0)
    {
        cout<<"0";return;
    }
    int signal=(a*b<0)? 1:0;
    a=abs(a),b=abs(b);
    if(signal)
        cout<<"(-";
    if(a/b)
        cout<<a/b;
    if(a%b)
    {        
        for(int i=(a>b)? b:a;i>1;i--)
        {
            if(a%i==0&&b%i==0)
            {
                a=a/i,b=b/i;
            }
        }
        printf("%s%d/%d",(a/b)? " ":"",a%b,b);
    }
    if(signal)
        cout<<")";
}

int main()
{
    int sign[2]={0},signal,num[4]={0};
    string input[2];
    cin>>input[0]>>input[1];
    for(int i=0;i<2;i++)
    {
        signal=0;
        for(int j=0;j<input[i].size();j++)
        {

            if(input[i][j]=='-')
                sign[i]=1;
            else if(input[i][j]=='/')
                signal++;
            else
                num[2*i+signal]=10*num[2*i+signal]+(int)input[i][j]-48;
        }
    }
    if(sign[0]==1)
        num[0]=-num[0];
    if(sign[1]==1)
        num[2]=-num[2];
    
    outans(num[0],num[1]);cout<<" + ";outans(num[2],num[3]);cout<<" = "; //这里可以把两个分数并成两个字符串的,不然运行时间过长,每次输出的时候都要算一遍,
//不过这样的话代码量又要多不少。 outans(num[
0]*num[3]+num[2]*num[1],num[1]*num[3]);cout<<endl; //个人觉得以目前计算机性能来说,这里不是必须这么做。 outans(num[0],num[1]);cout<<" - ";outans(num[2],num[3]);cout<<" = "; outans(num[0]*num[3]-num[2]*num[1],num[1]*num[3]);cout<<endl; outans(num[0],num[1]);cout<<" * ";outans(num[2],num[3]);cout<<" = "; outans(num[0]*num[2],num[1]*num[3]);cout<<endl; outans(num[0],num[1]);cout<<" / ";outans(num[2],num[3]);cout<<" = "; outans(num[0]*num[3],num[1]*num[2]);cout<<endl; return 0; }

例子中要把假分数转化为带分数,其实这挺好办,用‘/’运算可得商,用‘%’可得余数,‘余数/除数’就得到该带分数的分子部分。

原文地址:https://www.cnblogs.com/puffmoff/p/8481065.html