「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」。
题目描述
给你一个整数 n ,请你返回所有 0 到 1 之间(不包括 0 和 1)满足分母小于等于 n 的 最简 分数 。分数可以以 任意 顺序返回。
示例
示例 1:
输入:n = 2
输出:["1/2"]
解释:"1/2" 是唯一一个分母小于等于 2 的最简分数。
示例 2:
输入:n = 3
输出:["1/2","1/3","2/3"]
示例 3:
输入:n = 4
输出:["1/2","1/3","1/4","2/3","3/4"]
解释:"2/4" 不是最简分数,因为它可以化简为 "1/2" 。
示例 4:
输入:n = 1
输出:[]
提示: 1 <= n <= 100
题目分析
阅读完题目描述,我们可以知道题目要求的是要我们找出所有分母小于等于n的最简真分数,再看一下题目给的提示,n的数据范围为1~100,这个数据量并不大,所以我们可以直接枚举分母小于n的真分数,然后再判断一下该分数是否为最简分数,是最简分数的话就将其放进结果集合。写代码之前我们还需要了解两个比较简单的概念:
最简分数
什么是最简分数,最简分数的定义是分子、分母只有公因数1的分数,或者说分子和分母互质的分数,又称既约分数。如:二分之一,三分之二,九分之八,八分之三等等。
最大公因数
最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的最小公倍数记为[a,b]。 求解最大公因数的方法有很多,有兴趣的同学可以都去了解一下,这里我主要介绍一下辗转相除法。
辗转相除法
辗转相除法也叫欧几里得算法,用辗转相除法求几个数的最大公约数,可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。 写成代码如下:
gcd = function(x, y) {
while(x != 0 && y != 0){
let s = parseInt(x) + parseInt(y);
x = Math.max(x,y);
y = s - x;
x %= y;
}
return y;
}
代码
/**
* @param {number} n
* @return {string[]}
*/
var simplifiedFractions = function(n) {
let gcd = function(x, y) {
while(x != 0 && y != 0){
let s = parseInt(x) + parseInt(y);
x = Math.max(x,y);
y = s - x;
x %= y;
}
return y;
}
let res = [];
for(let i = 1; i < n; i++){
for(let j = i + 1; j <= n; j++){
if(gcd(i,j) == 1) res.push(i + '/' + j);
}
}
return res;
};