zoukankan      html  css  js  c++  java
  • 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; }

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

  • 相关阅读:
    再探动态库的应用
    GNU Binutils
    ELF文件详解—初步认识
    解读linux的/proc下的statm、maps、memmap内存信息文件
    Linux重新编译内核
    查看进程的内存布局
    manjaro设置开机动画
    最常规的修复方式 通过live cd
    拯救manjaro桌面
    linux下的库入门
  • 原文地址:https://www.cnblogs.com/puffmoff/p/8481065.html
Copyright © 2011-2022 走看看