1. 程式人生 > >PAT (Basic Level) Practice 1034 有理數四則運算

PAT (Basic Level) Practice 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();
}