这是pat乙级1062,我的答案中间有两个检测点错误,求指点
#include<stdio.h>
#include<string.h>
int sf(int a,int b)
{
int min= a>b?b:a;
for(int i=2; i<=min; i++)
{
if(a%i==0&&b%i==0)
return 0;
}
return 1;
}//判断是否最简
int main(void)
{
int a,b,c,d,e;
scanf("%d/%d %d/%d %d",&a,&b,&c,&d,&e);
int A,C;
A=a*d*e;
C=c*b*e; //通分
int f=1;
for(int i=1; i*b*d<C; i++)
{
if(i*b*d>=A&&i*b*d<=C&&f==1)
{
if(sf(i,e))
printf("%d/%d",i,e);
f=0;
continue;
}
if(i*b*d>=A&&i*b*d<=C)
{
if(sf(i,e))
printf(" %d/%d",i,e);
}
}
return 0;
}
要用辗转相除法,用单纯的除因子遍历可能会有问题
参考下这个方法
供参考:
#include <stdio.h>
void swap(int& a, int& b){ //引用
b = a + b;
a = b - a;
b = b - a;
}
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
int main()
{
int n1, m1, n2, m2, k, first, t;
scanf("%d/%d %d/%d %d", &n1, &m1, &n2, &m2, &k);
if (n1 * m2 > n2 * m1) {
swap(n1, n2);
swap(m1, m2);
}
for (t = n1 * k / m1 + 1, first = 1; t * m2 < k * n2; t++) {
if (gcd(t, k) == 1) {
if (first) {
printf("%d/%d", t, k);
first = 0;
}
else
printf(" %d/%d", t, k);
}
}
return 0;
}