1034 有理数四则运算 测试点2、3 辗转相除法

易错点

测试点2、3:要用long long,同时这两个点卡求gcd的运行时间,因此需要熟练掌握求gcd的辗转相除法的代码

int gcd(int a,int b){//求最大公约数,辗转相除法
	if(a<0){
		a=-a;
	}
	if(b<0){
		b=-b;
	}
	if(b==0){
		return a;
	}
	else{
		return gcd(b,a%b);
	}
}

测试点3:分子分母同为负数的情况

代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
using namespace std;

long long find_c(long long a,long long b){
	long long c;
	if(a<0){
		a=-a;
	}
	if(b<0){
		b=-b;
	}
//	if(a<b){
//		c=a;
//		a=b;
//		b=c;
//	}
//	for(int i=b;i>=1;i--){
//		if(a%i==0&&b%i==0){
//			return i;
//		}
//	}
	if(b==0){
		return a;
	}
	else{
		return find_c(b,a%b);
	}
}
void print_diy(long long a,long long b){
	if(a>0&&b<0){
		a=-a;
		b=-b;
	}
	long long tmp,tmp2,tmp3;
	tmp=(a);
	tmp2=(b);
	if(b==0){
		cout<<"Inf";
	}
	else if(a==0){
		cout<<"0";
	} 
	else{
		if(tmp<0&&tmp2<0){
			tmp=-tmp;
			tmp2=-tmp2;
		}
		while(find_c(tmp,tmp2)!=1){
			tmp3=find_c(tmp,tmp2);
			tmp/=tmp3;
			tmp2/=tmp3;
		}	
		if(abs(tmp)<=abs(tmp2)){
			if(tmp2==1){
				if(tmp*tmp2<0){
					cout<<"("<<tmp<<")";
				}	
				else{
					cout<<tmp;
				}
			}
			else{
				if(tmp*tmp2<0){
					cout<<"("<<tmp<<"/"<<tmp2<<")";
				}	
				else{
					cout<<tmp<<"/"<<tmp2;
				}
			}	
		}
		else if(abs(tmp)>abs(tmp2)){
			if(tmp2==1){
				if(tmp*tmp2<0){
					cout<<"("<<tmp<<")";
				}	
				else{
					cout<<tmp;
				}
			}
			else{
				if(tmp*tmp2<0){
					cout<<"("<<tmp/tmp2<<" "<<abs(tmp)%abs(tmp2)<<"/"<<tmp2<<")";
				}	
				else{
					cout<<tmp/tmp2<<" "<<abs(tmp)%abs(tmp2)<<"/"<<tmp2;
				}
			}	
		}		
	}
}
int main()
{
	string s1,s2,s3,s4;
	long long a,b,c,d;
	long long tmp,tmp2,tmp3;
	getline(cin,s1,'/');
	getline(cin,s2,' ');
	getline(cin,s3,'/');
	getline(cin,s4,'\n');
	a=stoll(s1);
	b=stoll(s2);
	c=stoll(s3);
	d=stoll(s4);
	print_diy(a,b);
	cout<<" + ";
	print_diy(c,d);
	cout<<" = ";
	print_diy(a*d+b*c,b*d);
	cout<<endl;
	
	print_diy(a,b);
	cout<<" - ";
	print_diy(c,d);
	cout<<" = ";
	print_diy(a*d-b*c,b*d);
	cout<<endl;
	
	print_diy(a,b);
	cout<<" * ";
	print_diy(c,d);
	cout<<" = ";
	print_diy(a*c,b*d);
	cout<<endl;
	
	print_diy(a,b);
	cout<<" / ";
	print_diy(c,d);
	cout<<" = ";
	print_diy(a*d,b*c);
	cout<<endl;
	return 0;
}
posted @ 2022-07-16 19:07  qwasdasd  阅读(100)  评论(0)    收藏  举报