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



具体思路见代码:


#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*3
	long long int sub2=b1*b2;                        //     ——  -  ——  =   ——————
	printfNum(sub1,sub2);                            //     3      4         3*4
	cout<<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;
}


提交代码


这是我的提交图 :



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值