https://pintia.cn/problem-sets/994805260223102976/problems/994805268334886912
这题我的想法是,先通分,让7/18,13/20,变成70/180,117/180,因为180可以看作12*15,因此我从71到116中找出是15的倍数的数,比如75/180就可以看坐5*15/12*15,约掉就是5/12,当然了,还是要排除这种情况,比如90/180可以看作6*15/12*15,约掉就是6/12,它们有公约数,不是最简的所以不行。
一开始测试点1错了,我猜出是输入的两个分数是前者大,后者小,需要交换位置。
但是无法通过测试点4,因为如果是这种情况,1/3,2/3,12,分数的最小公倍数是3,不能看作12的倍数,所以求出了两个分母的最小公倍数后,还要再求这个最小公倍数与12的最小公倍数。
#include<iostream>
using namespace std;
int gcd(int a, int b){
return b == 0 ? a : gcd(b, a % b);
}
int main() {
int n1, m1, n2, m2, k, m, t, flag = 0;
scanf("%d/%d %d/%d %d", &n1, &m1, &n2, &m2, &k);
// 两个分数的分母的最小公倍数
m = m1 * m2 / gcd(m1, m2);
m = m * k / gcd(m, k);
// 通分后的分子
n1 *= m/m1;
n2 *= m/m2;
if(n1 > n2){
swap(n1, n2);
}
t = m/k;
for(int i=n1+1; i<n2; i++){
if(i%t==0 && gcd(i/t, k)==1){
if(flag>0)
cout << " ";
cout << i/t << "/" << k;
flag ++;
}
}
return 0;
}