1062 最简分数 测试点1、2、4
作者:互联网
易错点
测试点1:审题务必仔细!题干中没有说明N1/M1 和 N2/M2的大小,容易认为N1/M1小于 N2/M2,但可能有N1/M1大于 N2/M2
测试点2:注意遍历的方法,以免运行超时
测试点4:查找分母和分子的公因数的时候,须考虑分母可能是分子的倍数
关键
- 找可能的分子
- 判断两个数是否互质
代码
#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