一个分数一般写成两个整数相除的形式:N/M,其中 M 不为0。最简分数是指分子和分母没有公约数的分数表示形式。
现给定两个不相等的正分数 N?1??/M?1?? 和 N?2??/M?2??,要求你按从小到大的顺序列出它们之间分母为 K 的最简分数。
输入格式:
输入在一行中按 N/M 的格式给出两个正分数,随后是一个正整数分母 K,其间以空格分隔。题目保证给出的所有整数都不超过 1000。
输出格式:
在一行中按 N/M 的格式列出两个给定分数之间分母为 K 的所有最简分数,按从小到大的顺序,其间以 1 个空格分隔。行首尾不得有多余空格。题目保证至少有 1 个输出。
输入样例:
1 | 7/18 13/20 12 |
输出样例:
1 | 5/12 7/12 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include <cstdio> #include <vector> #include <set> #include <algorithm> using namespace std; bool is_gcd (double c, double d) { bool result = true; double tem; if (c > d) { tem = d; d = c; c = tem; } for (int i=2; i<=c; i++) { if ((int)c%i==0 && (int)d%i==0) { result = false; } } return result; } int main() { double N1, M1, N2, M2; scanf ("%lf/%lf", &N1, &M1); double a = N1 / M1; scanf ("%lf/%lf", &N2, &M2); double b = N2 / M2; double k, temp; scanf ("%lf", &k); if (a > b ) { temp = b; b = a; a = temp; } int flag = 1; for (double i=1; i<k; i++) { temp = i / k; if (temp>a && temp<b) { if (is_gcd(i, k)) { if (flag == 1) { flag = 0; printf ("%.f/%.f", i, k); } else { printf (" %.f/%.f", i, k); } } } } return 0; } |