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

乙级1034
在这里插入图片描述
在这里插入图片描述

题意简单粗暴的模拟题,就是非常复杂
首先,我是将数字分成输入的a1b1c1、a2b2c2,以及输出的a3b3c3,c代表的是带分数的整数部分,如果有负数&&c有值,将负数赋予c,这样便于后期输出
其次是理好各种细节处理
1.化简及其效率(测试点4就是测试效率)
2.假分数转换成带分数
3.负数、分子为0、带分数的整数部分为0、计算结果 这四种输出情况
4.计算时的问题,负的带分数事实上应该是-(c + a/b) 需在计算上注意

卡了N天,自己在第1、4点上出了毛病,这种题真看细节啊……具体的化简方法日后奉上
AC代码:

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
long long a1,b1,a2,b2,c1,c2,a3,b3,c3;
void getnum(){
	cin>>a1;
	getchar();
	cin>>b1;
	cin>>a2;
	getchar();
	cin>>b2;
}
long long gcd(long long a,long long b)
{
   return b==0?a:gcd(b,a%b);
}
void simplify(long long &a,long long &b){
	int d = gcd(a,b);
	if(d<0)	d = -d;
	a = a/d;
	b = b/d;
}
void improper_to_proper(long long &a,long long &b,long long &c){ //假分数转真分数 
	c = a/b;
	if(c>=0)	a -= (b*c);
	else		a = (a - b*c)*(-1);
	
}
void pr(long long &a,long long &b,long long &c){
	if(a==0){
		if(c>=0){
			cout<<c;
		}else{
			cout<<'('<<c<<')';
		}
	}else{
		if(c>0){
			cout<<c<<' '<<a<<'/'<<b;
		}else if(c==0){
			if(a>0){
				cout<<a<<'/'<<b;
			}else{
				cout<<'('<<a<<'/'<<b<<')';
			}
		}else{
			cout<<'('<<c<<' '<<a<<'/'<<b<<')';
		}
	}
}
void sum(){//求和 
	if(c1<0){
		if(c2<0){
			a3 = (c1*b1-a1)*b2 + (c2*b2-a2)*b1;
		}else{
			a3 = (c1*b1-a1)*b2 + (c2*b2+a2)*b1;
		}
	}else{
		if(c2<0){
			a3 = (c1*b1+a1)*b2 + (c2*b2-a2)*b1;
		}else{
			a3 = (c1*b1+a1)*b2 + (c2*b2+a2)*b1;
		}
	}
	b3 = b1*b2;
	simplify(a3,b3);
	improper_to_proper(a3,b3,c3);
	pr(a1,b1,c1);
	cout<<" + ";
	pr(a2,b2,c2);
	cout<<" = ";
	pr(a3,b3,c3);
	cout<<endl;
}
void subtraction(){
	if(c1<0){
		if(c2<0){
			a3 = (c1*b1-a1)*b2 - (c2*b2-a2)*b1;
		}else{
			a3 = (c1*b1-a1)*b2 - (c2*b2+a2)*b1;
		}
	}else{
		if(c2<0){
			a3 = (c1*b1+a1)*b2 - (c2*b2-a2)*b1;
		}else{
			a3 = (c1*b1+a1)*b2 - (c2*b2+a2)*b1;
		}
	}
	b3 = b1*b2;
	simplify(a3,b3);
	improper_to_proper(a3,b3,c3);
	pr(a1,b1,c1);
	cout<<" - ";
	pr(a2,b2,c2);
	cout<<" = ";
	pr(a3,b3,c3);
	cout<<endl;
}
void multiplication(){
	if(c1<0){
		if(c2<0){
			a3 = (c1*b1-a1)*(c2*b2-a2);
		}else{
			a3 = (c1*b1-a1)*(c2*b2+a2);
		}
	}else{
		if(c2<0){
			a3 = (c1*b1+a1)*(c2*b2-a2);
		}else{
			a3 = (c1*b1+a1)*(c2*b2+a2);
		}
	}
	b3 = b1*b2;
	simplify(a3,b3);
	improper_to_proper(a3,b3,c3);
	pr(a1,b1,c1);
	cout<<" * ";
	pr(a2,b2,c2);
	cout<<" = ";
	pr(a3,b3,c3);
	cout<<endl;
}
void division(){
	
	pr(a1,b1,c1);
	cout<<" / ";
	pr(a2,b2,c2);
	cout<<" = ";
	if(c2==0&&a2==0){
		cout<<"Inf"<<endl;
//		cout<<"Inf";
		return;
	}
	if(c1<0){
		if(c2<0){
			a1 = c1*b1-a1;
			a2 = c2*b2-a2;
		}else{
			a1 = c1*b1-a1;
			a2 = c2*b2+a2;
		}
	}else{
		if(c2<0){
			a1 = c1*b1+a1;
			a2 = c2*b2-a2;
		}else{
			a1 = c1*b1+a1;
			a2 = c2*b2+a2;
		}
	}
	a3 = a1*b2;
	b3 = a2*b1;
	if(b3<0){
		a3 = -a3;
		b3 = -b3;
	} 
	simplify(a3,b3);
	improper_to_proper(a3,b3,c3);
	pr(a3,b3,c3);
	cout<<endl;
}
int main(){
	getnum();
	simplify(a1,b1);
	improper_to_proper(a1,b1,c1); 
	simplify(a2,b2);
	improper_to_proper(a2,b2,c2); 
	sum();
	subtraction();
	multiplication();
	division();
}

猜你喜欢

转载自blog.csdn.net/a656418zz/article/details/84189319