pat 乙级 1034. 有理数四则运算(20)

来源:互联网 发布:楠楠广场舞网络一线牵 编辑:程序博客网 时间:2024/06/05 16:31



具体思路见代码:


#include <stdio.h>#include <iostream>#include <cstdlib>#include <cmath>#include <cctype>#include <string>#include <cstring>#include <algorithm>#include <ctime>///////////////          垮掉!!!!!!!!!!!  考虑 超时 问题 !!可以考虑 先化最简分数 。会减少代码的冗余度。 using namespace std;// 求最大公约数// long long int gcd(long long int t1, long long int t2) {return t2 == 0 ? t1 : gcd(t2, t1 % t2);}//本来自己写了个,然后超时了= =||             gcd// 把两个 整数 按照 分母 a / b 格式输出 ;// void printfNum(long long int m,long long int n) {// long long int  t = gcd (m,n);     //求出 最大公约数t  先化成最简分数 。// long long int a=abs(m/t);         //然后  化成最简分数 。// long long int b=abs(n/t);         // 取绝对值 方便后面计算;// if (m==0) {// cout<<"0";// }// if (n==0) {// cout<<"Inf";// }// if (m*n>0 && a>b && a%b!=0) {// cout<<a/b<<" "<<a-(a/b*b)<<"/"<<b;     // 比如 5/3  等于 1 2/3 其中 1=5/3;  2/3 = (5-5/3*3)/3 // }// if (m*n>0 && a>=b &&a%b==0) {// cout<<a/b;// }//  if (m*n>0 && a<b) {// cout<<a<<"/"<<b;// }// if (m*n<0 && a>b && a%b!=0) {// cout<<"(-"<<a/b<<" "<<a-(a/b*b)<<"/"<<b<<")";// }// if (m*n<0 && a>=b && a%b==0) {// cout<<"(-"<<a/b<<")";// }// if (m*n<0 && a<b) {// cout<<"(-"<<a<<"/"<<b<<")";// }// }         一开始 写的方法 无论如何都过不了 测试点2 所以放弃~~重新写 ,不过这里注释一下 方便日后改写。// 把两个 整数 按照 分母 a / b 格式输出 ;void printfNum(long long int m, long long int n) {    int flag1 = 0;      // 标记m  正负  =0 代表为大于0  =1 代表小于0     int flag2 = 0;      // 标记n  正负    if (n == 0) {        cout << "Inf";        return ;    }    if (m == 0) {        cout << 0;        return ;    }    if (m < 0) {        m = 0 - m;       // 取反 方便 计算         flag1 = 1;    }    if (n < 0) {        n = 0 - n;        flag2 = 1;    }    int flag = 0;   // 标记  m * n 正负   0  代表为正  1代表为负     if (flag1 == 1 && flag2 == 1) {        flag = 0;             } else if (flag1 == 1 || flag2 == 1) {        flag = 1;        }    if (m == n) {         if (flag == 1)            cout << "(-1)";        else            cout << "1";        return;    }        long long int x = m % n;  // 判断是否 能整除     long long int y = m / n;    if (x == 0) {    // 能整除        if (flag == 0)            cout << y;       //  为正 并且 刚好能整除;        else            cout << "(-" << y << ")";   // 为负 。        return ;    } else {             //  判断不能整除的情况          long long int t1 = m - y * n;         // 这里无需比较m 与n 的大小问题 因为y=m/n 如果m<n y=0;所以无需再判断        long long int t2 = n;        long long int t = gcd(t1, t2);    // 最大公约数         t1 = t1 / t;      //  化为最简         t2 = t2 / t;        if (flag == 1) {            cout << "(-";            if (y != 0)                     cout << y << " " << t1 << "/" << t2;            else                cout << t1 << "/" << t2;  //    y=0  就是 输入的m<n,应当输出 m/n 的形式            cout << ")";        } else {            if (y != 0)                cout << y << " " << t1 << "/" << t2;            else                cout << t1 << "/" << t2;        }    }}void calculate(long long a1,long long b1,long long a2,long long b2,char c) {printfNum(a1,b1);cout<<" "<<c<<" ";printfNum(a2,b2);cout<<" = ";}int main() {long long int a1,b1,a2,b2;scanf("%lld/%lld%lld/%lld",&a1,&b1,&a2,&b2);// 求加法:calculate(a1,b1,a2,b2,'+');long long int sum1=a1*b2+b1*a2;long long int sum2=b1*b2;printfNum(sum1,sum2);cout<<endl;// 求减法 :calculate(a1,b1,a2,b2,'-');long long int sub1=a1*b2-b1*a2;                  //     2      3       2*4-3*3long long int sub2=b1*b2;                        //     ——  -  ——  =   ——————printfNum(sub1,sub2);                            //     3      4         3*4cout<<endl;                                // 求乘法 calculate(a1,b1,a2,b2,'*');long long int mul1=a1*a2;long long int mul2=b1*b2;printfNum(mul1,mul2);cout<<endl;// 求除法;calculate(a1,b1,a2,b2,'/');long long int div1=a1*b2;long long int div2=b1*a2;printfNum(div1,div2);return 0;}


提交代码


这是我的提交图 :