下面是用C语言编写的程序来解决这个问题:

#include <stdio.h>
#include <stdlib.h>

int gcd(int a, int b) {
    if (b == 0) {
        return a;
    }
    return gcd(b, a % b);
}

void closestFraction(int x, int y, int n) {
    int a = 0, b = 1;

    double minDiff = (double)x / y;
    for (int i = 1; i <= n; i++) {
        int j = (x * i) / y;
        if (abs((double)x / y - (double)j / i) < minDiff) {
            minDiff = abs((double)x / y - (double)j / i);
            a = j;
            b = i;
        } else if (abs((double)x / y - (double)j / i) == minDiff) {
            if (i < b) {
                a = j;
                b = i;
            } else if (i == b && j < a) {
                a = j;
                b = i;
            }
        }
    }

    // 约分
    int gcdValue = gcd(a, b);
    a /= gcdValue;
    b /= gcdValue;

    printf('%d/%d\n', a, b);
}

int main() {
    int x, y, n;
    scanf('%d %d %d', &x, &y, &n);

    closestFraction(x, y, n);

    return 0;
}

这个程序首先定义了一个函数gcd来计算两个数的最大公约数。

然后,定义了一个closestFraction函数来解决题目要求的问题。该函数通过遍历所有可能的分母并计算与给定分数的差值,找到最接近的分数。

在遍历过程中,如果找到了一个更接近的分数,则更新minDiffab的值。如果找到的分数与当前最接近的分数相同,则根据题目要求选择分母最小的一个,如果分母仍然相同,则选择分子最小的一个。

最后,将ab分别除以它们的最大公约数进行约分,并将结果以“a/b”的格式输出。

main函数中,程序首先读取输入的三个整数xyn,然后调用closestFraction函数来解决问题。

注意:这个程序没有进行输入验证,假设输入的数据符合题目要求的范围。


原文地址: https://www.cveoy.top/t/topic/QoU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录