1062 最简分数(20 分)
一个分数一般写成两个整数相除的形式:N/M,其中 M 不为0。最简分数是指分子和分母没有公约数的分数表示形式。
现给定两个不相等的正分数 N1/M1 和 N2/M2,要求你按从小到大的顺序列出它们之间分母为 K 的最简分数。
输入格式:
输入在一行中按 N/M 的格式给出两个正分数,随后是一个正整数分母 K,其间以空格分隔。题目保证给出的所有整数都不超过 1000。
输出格式:
在一行中按 N/M 的格式列出两个给定分数之间分母为 K 的所有最简分数,按从小到大的顺序,其间以 1 个空格分隔。行首尾不得有多余空格。题目保证至少有 1 个输出。
输入样例:
7/18 13/20 12
输出样例:
5/12 7/12
分析:输入数值,在范围内判断以K为分母的分数是否分子分母互质。这里还有一个点:输入的两个分数是否为先小后大,如否,则需要进行处理。
代码:
#include<iostream>
using namespace std;
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
int main() {
int N1, M1, N2, M2;
int K;
scanf("%d/%d %d/%d %d", &N1, &M1, &N2, &M2, &K);
double A = 1.0 * N1 / M1, B = 1.0 * N2 / M2;
if (A > B) {
double temp = A;
A = B;
B = temp;
}
bool isFirst = true;
for (int i = 1; i < K; i++) {
double X = 1.0 * i / K;
if (X > A && X < B && gcd(i, K) == 1) {
if (isFirst == true) {
isFirst = false;
cout << i << '/' << K;
}else {
cout << ' ' << i << '/' << K;
}
}
}
}