C语言程序:寻找与给定分数最接近的分数
下面是用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函数来解决题目要求的问题。该函数通过遍历所有可能的分母并计算与给定分数的差值,找到最接近的分数。
在遍历过程中,如果找到了一个更接近的分数,则更新minDiff、a和b的值。如果找到的分数与当前最接近的分数相同,则根据题目要求选择分母最小的一个,如果分母仍然相同,则选择分子最小的一个。
最后,将a和b分别除以它们的最大公约数进行约分,并将结果以“a/b”的格式输出。
在main函数中,程序首先读取输入的三个整数x、y和n,然后调用closestFraction函数来解决问题。
注意:这个程序没有进行输入验证,假设输入的数据符合题目要求的范围。
原文地址: https://www.cveoy.top/t/topic/QoU 著作权归作者所有。请勿转载和采集!