其他分享
首页 > 其他分享> > 1062 最简分数 测试点1、2、4

1062 最简分数 测试点1、2、4

作者:互联网

易错点

测试点1:审题务必仔细!题干中没有说明N1/M1 和 N2/M2的大小,容易认为N1/M1小于 N2/M2,但可能有N1/M1大于 N2/M2

测试点2:注意遍历的方法,以免运行超时

测试点4:查找分母和分子的公因数的时候,须考虑分母可能是分子的倍数

关键

  1. 找可能的分子
  2. 判断两个数是否互质

代码

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

int gcd(int a, int b){
	if(b==0){
		return a;
	}
	else{
		return gcd(b, a % b);
	}
}
bool na(long long a,long long b){
	if(a>b){
		;
	}
	else{
		int c;
		c=a;
		a=b;
		b=c;
	}
	if(a%2==0&&b%2==0){
		return 0;
	}
	for(int i=3;i<=b;i+=2){
		if(b%i==0){
			if(a%i==0){
				return 0;
			}
		}
	}
	return 1;
}
int tona(long long a,long long b){
	if(a>b){
		;
	}
	else{
		int c;
		c=a;
		a=b;
		b=c;
	}
	if(a%2==0&&b%2==0){
		return 2;
	}
	for(int i=3;i*i<=b;i+=2){
		if(b%i==0){
			if(a%i==0){
				return i;
			}
		}
	}
}
int main()
{
	long long a,b,c,d;
	string s1,s2,s3,s4;
	long long k;
	getline(cin,s1,'/');
	getline(cin,s2,' ');
	getline(cin,s3,'/');
	getline(cin,s4,' ');
	a=stoi(s1);
	b=stoi(s2);
	c=stoi(s3);
	d=stoi(s4);
	if(a<0){
		a=-a;
		b=-b;
	}
	if(c<0){
		c=-c;
		d=-d;
	}
	int tmp3=0,tmp4=0;
	if(a*d>b*c){
		tmp3=a;
		a=c;
		c=tmp3;
		tmp4=b;
		b=d;
		d=tmp4;
	}
	int tmp5;
	while(na(a,b)==0){
		tmp5=tona(a,b);
		a=a/tmp5;
		b=b/tmp5;
	}
	while(na(c,d)==0){
		tmp5=tona(c,d);
		c=c/tmp5;
		d=d/tmp5;
	}
	cin>>k;
	int tmp=0;
	int tmp2=0;
	for(long long i=k*d*a+1;i<=k*c*b-1;){	
		if(i%(b*d)==0){	
			if(na(k,(i/(b*d)))==1){//i/(b*d)和k互质 
//			if(gcd(k,(i/(b*d)))==1&&k!=(i/(b*d))){//i/(b*d)和k互质 
				if(tmp==0){
					cout<<(i/(b*d))<<"/"<<k;
					tmp=1;
				}
				else{
					cout<<" "<<(i/(b*d))<<"/"<<k;
				}
			}
			tmp2=1;
			i+=(b*d);
		}
		if(tmp2==0){
			if(i==k*d*a+1){
				i--;
			}
			i+=d;
		}
	}
	return 0;
}

标签:简分数,return,测试点,int,1062,long,M1,tmp5
来源: https://www.cnblogs.com/wodeblog1982/p/16467599.html