【PAT B1062】 最简分数

2021/5/30 18:53:48

本文主要是介绍【PAT B1062】 最简分数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一个分数一般写成两个整数相除的形式: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

思路:使n1/m1<n/k<n2/m2,再找到所有的n,判断n和k的最大公约数是否为1,再输出即可。

#include <cstdio>
#include <algorithm>

using namespace std;

int gcd(int a, int b) {
    if (!b) return a;
    else return gcd(b, a % b);
}

int main() {
    int n1, m1, n2, m2, k;
    scanf("%d/%d %d/%d %d", &n1, &m1, &n2, &m2, &k);
    if (n1 * m2 > n2 * m1) {//使前面一个分数始终小于后面的分数
        swap(n1, n2);
        swap(m1, m2);
    }
    bool flag = false;
    int n = 1;
    while (n1 * k >= m1 * n) {//找到n/k >n1/m1
        n++;
    }
    while (m2 * n < n2 * k) {//num/k < n2/m2时
        if (gcd(n, k) == 1) {
            printf("%s%d/%d", !flag ? "" : " ", n, k);
            flag = true;
        }
        n++;
    }
    return 0;
}


这篇关于【PAT B1062】 最简分数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程