分数は通常、2 つの整数の除算として記述されます: N/M (M はゼロではありません)。最小分数は、分子と分母に公約数がない分数の表現です。
ここで、2 つの等しくない正の分数 N1 /M1 と N2 /M2 が与えられた場合、それらの間の分母 K を含む最も単純な分数を昇順でリストする必要があります。
入力形式:
入力では、1 行に N/M の形式で 2 つの正の分数が表示され、その後にスペースで区切られた正の整数の分母 K が続きます。タイトルは、指定されたすべての整数が 1000 を超えないことを保証します。
出力フォーマット:
与えられた 2 つの分数の間の分母が K である最も単純な分数をすべて N/M 形式で 1 行に昇順に、1 つのスペースで区切ってリストします。行の先頭または末尾に余分なスペースがあってはなりません。タイトルには少なくとも 1 つの出力が保証されます。
例:
7/18 13/20 12
出力例:
5/12 7/12
実際には、指定されたサイズの 2 つの分数の間で、分子と分母が最大公約数を持たない (つまり、最大公約数が 1 である) 分数を見つけることです。
__gcd(,) は、2 つの数値間の最大公約数を見つけるライブラリ関数です。
#include<bits/stdc++.h>
using namespace std;
int main()
{
double n1,n2,m1,m2;
int k;
scanf("%lf/%lf %lf/%lf %d",&n1,&m1,&n2,&m2,&k);
double mx,mn;
int flag = 0;
mx = max(n1/m1,n2/m2);
mn = min(n1/m1,n2/m2);
for(int i = 0;i<=k;i++){
double t = i*1.0/(k*1.0);
if(t>mn&&t<mx&&__gcd(i,k) == 1){
if(flag==0) {printf("%d/%d",i,k); flag = 1;}
else printf(" %d/%d",i,k);
}
}
return 0;
}