比较两个分数的大小
在数学中,比较两个分数的大小最常用的方法是通分,即找到分母的最小公倍数,将分子扩大相同倍数后再进行比较。我们可以用 C 语言来模拟这个过程。
核心思路
程序主要依赖两个步骤:
- 计算两个分母的最小公倍数(LCM)。
- 将两个分数转换为同分母形式,直接比较分子大小。
为了更直观地展示算法效率,代码中还加入了简单的计时功能。
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 求最小公倍数
// 原理:LCM(a, b) = (a * b) / GCD(a, b)
long int gongbeishu(int a, int b) {
int temp;
int k1 = a, k2 = b;
// 使用欧几里得算法求最大公约数
while (a % b != 0) {
temp = a;
a = b;
b = temp % b;
}
return k1 * k2 / b;
}
int main() {
long int start, finish;
int a, b, c, d;
// 输入格式:a/b,c/d (例如 1/2,3/4)
printf("请输入两个分数 (格式:a/b,c/d): ");
scanf("%d/%d,%d/%d", &a, &b, &c, &d);
start = clock();
// 通分后比较分子
// 第一个分数变为:a * (LCM/b)
// 第二个分数变为:c * (LCM/d)
if (a * (gongbeishu(d, b) / b) - c * (gongbeishu(b, d) / d) > 0) {
printf("\n%d/%d > %d/%d\n", a, b, c, d);
} else if (a * (gongbeishu(d, b) / b) - c * (gongbeishu(b, d) / d) < 0) {
printf("\n%d/%d < %d/%d\n", a, b, c, d);
} else {
printf("\n%d/%d = %d/%d\n", a, b, c, d);
}
finish = clock();
printf("\n运行耗时:%lfs\n", (finish - start) / 1000.0);
return 0;
}
几点说明
- 关于最小公倍数函数:这里复用了最大公约数的计算逻辑(辗转相除法),最后通过公式
(a*b)/gcd得到最小公倍数。注意变量k1,k2保存了原始值,因为循环中a,b会被修改。 - 输入格式:
scanf中的/和,是字面量,输入时必须严格匹配,比如1/2,3/4。 - 性能优化:对于简单的分数比较,其实可以直接交叉相乘(
a*dvsc*b),避免计算公倍数带来的开销。但在教学或特定场景下,通分法更能体现分数的本质。
这段代码结构清晰,适合用来练习基本的输入输出、函数调用以及算法逻辑的实现。


