PAT (Basic Level) Practice 1034 有理数四则运算 (20分)

本博客详细介绍了PAT基础级别实践题1034 - 有理数四则运算的解题思路与要求。通过样例输入输出展示了加、减、乘、除四种运算的结果,并提到了在处理有理数时的最简形式与负数表示。同时,博主分享了在解决此问题过程中遇到的困难,从错误代码到最终的清晰解决方案的演变过程。
摘要由CSDN通过智能技术生成

1034 有理数四则运算 (20 分)
本题要求编写程序,计算 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)
输入样例 2:
5/3 0/6
输出样例 2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

推荐代码https://blog.csdn.net/weixin_38505045/article/details/84782384

PAT乙级最恶心的一道题了吧,从零个点调到两个点,修修补补漏洞越来越难改,干脆推倒重新写,用好一点的清晰一点的处理办法。

以下为错误代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
string s;
long long gcd(long long a,long long b){
	if(b==0)return a;
	else	
		return gcd(b,a%b);
}
long long a1,a2,b1,b2;
long long vis[1000];
void jia(){
	long long gcd1=gcd(abs(a1),abs(a2));
	long long gcd2=gcd(abs(a1),abs(a2));
	long long gcd3=gcd(abs(b1),abs(b2));
	long long gcd4=gcd(abs(b1),abs(b2));
	a1/=gcd1;
	a2/=gcd2;
	b1/=gcd3;
	b2/=gcd4;
	if(a1<0)
		cout<<"(";
	if(a1==0||a1%a2==0)
		cout<<a1/a2;
	else
		cout<<a1<<"/"<<a2;
	if(a1<0)
		cout<<")";
	cout<<" + ";
	if(b1<0)
		cout<<"(";
	if(b1==0||b1%b2==0)
		cout<<b1/b2;
	else
		cout<<b1<<"/"<<b2;
	if(b1<0)
		cout<<")";
		
	cout<<" = ";
	if((a1*b2+b1*a2)<0)
		cout<<"(";
	if(abs(a1*b2+b1*a2)>a2*b2){
		if((a1*b2+b1*a2)%(a2*b2)==0)	
			cout<<(a1*b2+b1*a2)/(a2*b2);
		else{
		cout<<(a1*b2+b1*a2)/(a2*b2);	
			cout<<" "<<abs((a1*b2+b1*a2)-(a1*b2+b1*a2)/(a2*b2)*(a2*b2))/gcd(abs((a1*b2+b1*a2)-(a1*b2+b1*a2)/(a2*b2)*(a2*b2)),abs(a2*b2))<<"/"<<abs((a2*b2))/gcd(abs((a1*b2+b1*a2)-(a1*b2+b1*a2)/(a2*b2)*(a2*b2)),abs(a2*b2));
		}
	}
	else{
		if((a1*b2+b1*a2)%(a2*b2)!=0)	
			cout<<((a1*b2+b1*a2)-(a1*b2+b1*a2)/(a2*b2)*(a2*b2))/gcd(abs((a1*b2+b1*a2)-(a1*b2+b1*a2)/(a2*b2)*(a2*b2)),abs(a2*b2))<<"/"<<abs((a2*b2))/gcd(abs((a1*b2+b1*a2)-(a1*b2+b1*a2)/(a2*b2)*(a2*b2)),abs(a2*b2));
		else
			cout<<(a1*b2+b1*a2)/(a2*b2);
	}

	if((a1*b2+b1*a2)<0)
		cout<<")";
	cout<<endl;
}
void jian(){
	long long gcd1=gcd(abs(a1),abs(a2));
	long long gcd2=gcd(abs(a1),abs(a2));
	long long gcd3=gcd(abs(b1),abs(b2));
	long long gcd4=gcd(abs(b1),abs(b2));
	a1/=gcd1;
	a2/=gcd2;
	b1/=gcd3;
	b2/=gcd4;
	if(a1<0)
		cout<<"(";
	if(a1==0||a1%a2==0)
		cout<<a1/a2;
	else
		cout<<a1<<"/"<<a2;
	if(a1<0)
		cout<<")";
	cout<<" - ";
	if(b1<0)
		cout<<"(";
	if(b1==0||b1%b2==0)
		cout<<b1/b2;
	else
		cout<<b1<<"/"<<b2;
	if(b1<0)
		cout<<")";
		
	cout<<" = ";
	
	if((a1*b2-b1*a2)<0)
		cout<<"(";
	if(abs(a1*b2-b1*a2)>a2*b2){
		if((a1*b2-b1*a2)%(a2*b2)==0)
			cout<<(a1*b2-b1*a2)/(a2*b2);
		else{
			cout<<(a1*b2-b1*a2)/(a2*b2)<<" ";		
			cout<<abs((a1*b2-b1*a2)-(a1*b2-b1*a2)/(a2*b2)*(a2*b2))/gcd(abs((a1*b2-b1*a2)-(a1*b2-b1*a2)/(a2*b2)*(a2*b2)),abs(a2*b2))<<"/"<<abs((a2*b2))/gcd(abs((a1*b2-b1*a2)-(a1*b2-b1*a2)/(a2*b2)*(a2*b2)),abs(a2*b2));
		}
	}
	else{
		if((a1*b2-b1*a2)%(a2*b2)!=0)
			cout<<((a1*b2-b1*a2)-(a1*b2-b1*a2)/(a2*b2)*(a2*b2))/gcd(abs((a1*b2-b1*a2)-(a1*b2-b1*a2)/(a2*b2)*(a2*b2)),abs(a2*b2))<<"/"<<abs((a2*b2))/gcd(abs((a1*b2-b1*a2)-(a1*b2-b1*a2)/(a2*b2)*(a2*b2)),abs(a2*b2));
		else
			cout<<(a1*b2-b1*a2)/(a2*b2);
	}

	if((a1*b2-b1*a2)<0)
		cout<<")";
	cout<<endl;
}
void cheng(){
	long long gcd1=gcd(abs(a1),abs(a2));
	long long gcd2=gcd(abs(a1),abs(a2));
	long long gcd3=gcd(abs(b1),abs(b2));
	long long gcd4=gcd(abs(b1),abs(b2));
	a1/=gcd1;
	a2/=gcd2;
	b1/=gcd3;
	b2/=gcd4;
	if(a1<0)
		cout<<"(";
	if(a1==0||a1%a2==0)
		cout<<a1/a2;
	else
		cout<<a1<<"/"<<a2;
	if(a1<0)
		cout<<")";
	cout<<" * ";
	if(b1<0)
		cout<<"(";
	if(b1==0||b1%b2==0)
		cout<<b1/b2;
	else
		cout<<b1<<"/"<<b2;
	if(b1<0)
		cout<<")";
		
	cout<<" = ";
	if(a1*b1<0)
		cout<<"("; 
	long long shang=a1*b1;
	long long xia=a2*b2;
	if(abs(shang)>xia){
		if((shang)%(xia)==0)
			cout<<shang/xia;
		else{
		cout<<shang/xia<<" ";
		cout<<abs(shang-(shang/xia)*xia)/gcd(abs(shang-(shang/xia)*xia),xia)<<"/"<<xia/gcd(abs(shang-(shang/xia)*xia),xia);
		}
	}
	else{
		if((shang)%(xia)!=0)
			cout<<(shang-(shang/xia)*xia)/gcd(abs(shang-(shang/xia)*xia),xia)<<"/"<<xia/gcd(abs(shang-(shang/xia)*xia),xia);
		else
			cout<<shang/xia;
	}
	if(shang<0)
		cout<<")";
	cout<<endl;
}
void chu(){
	if(b1==0){
			long long gcd1=gcd(abs(a1),abs(a2));
			long long gcd2=gcd(abs(a1),abs(a2));
			a1/=gcd1;
			a2/=gcd2;
		
		if(a1<0)
			cout<<"(";
		if(a1==0||a1%a2==0)
			cout<<a1/a2;
		else
			cout<<a1<<"/"<<a2;
		if(a1<0)
			cout<<")";
		cout<<" / 0 = Inf";
		return;
	}
	long long gcd1=gcd(abs(a1),abs(a2));
	long long gcd2=gcd(abs(a1),abs(a2));
	long long gcd3=gcd(abs(b1),abs(b2));
	long long gcd4=gcd(abs(b1),abs(b2));
	a1/=gcd1;
	a2/=gcd2;
	b1/=gcd3;
	b2/=gcd4;
	if(a1<0)
		cout<<"(";
	if(a1==0||a1%a2==0)
		cout<<a1/a2;
	else
		cout<<a1<<"/"<<a2;
	if(a1<0)
		cout<<")";
	cout<<" / ";
	if(b1<0)
		cout<<"(";
	if(b1==0||b1%b2==0)
		cout<<b1/b2;
	else
		cout<<b1<<"/"<<b2;
	if(b1<0)
		cout<<")";
		
	cout<<" = ";
	if(a1*b1<0)
		cout<<"("; 
	long long fu=0;
	if((a1<0&&b1>0)||(b1<0&&a1>0)){
		fu=1;
	}
	long long shang=abs(a1*b2);
	long long xia=abs(a2*b1);

	if(abs(shang)>xia){
		if((shang)%(xia)==0){
		if(fu)
				cout<<"-";
			cout<<shang/xia;
		}
		else{
		if(fu)
			cout<<"-";	
		cout<<shang/xia<<" ";
		cout<<abs(shang-(shang/xia)*xia)/gcd(abs(shang-(shang/xia)*xia),xia)<<"/"<<xia/gcd(abs(shang-(shang/xia)*xia),xia);
		}
	}
	else{
		if((shang)%(xia)!=0){
			if(fu)
				cout<<"-";
			cout<<(shang-(shang/xia)*xia)/gcd(abs(shang-(shang/xia)*xia),xia)<<"/"<<xia/gcd(abs(shang-(shang/xia)*xia),xia);
		
		}
		else{
			if(fu)
				cout<<"-";
			cout<<shang/xia;
		}
	}
	if(fu)
		cout<<")";
	cout<<endl;
}
int main(){
	scanf("%lld/%lld",&a1,&a2);
	scanf("%lld/%lld",&b1,&b2);
	jia();
	jian();
	cheng();
	chu();
	return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值