题目地址:最简分数
解题思路
因为要求值要在(0,1)之内,所以分子要比分母小,根据示例,罗列了一下,当
n = 6
应该输出:

因为要求分子和分母是最简分数,也就是🈯️:分子和分母的最大公约数是1,所以第一版本代码
代码
/*** @param {number} n* @return {string[]}*/var simplifiedFractions = function(n) {const result = [];if(n>1){for(let i = 1;i<n;i++){for(let j = i+1;j<=n;j++){let flag = false;if(i !== 1){let c = i;while(c>1){if(j % c == 0 && i % c == 0){flag = true;break;}c--;}}if(!flag || i === 1){result.push(`${i}/${j}`);}}}}return result;};const key = 8;console.log(simplifiedFractions(key));
官方题解
官方题解,在求取两个数的最大公约数时,可以用辗转相除(欧几里得算法)
var simplifiedFractions = function(n) {const ans = [];for (let denominator = 2; denominator <= n; ++denominator) {for (let numerator = 1; numerator < denominator; ++numerator) {if (gcd(numerator, denominator) == 1) {ans.push(numerator + "/" + denominator);}}}return ans;};const gcd = (a, b) => {if (b === 0) {return a;}return gcd(b, a % b);}
证明如下:
假设a>b, a可以表示成a = kb + r(a,b,k,r皆为正整数,且r而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数, 因此d|r 因此d也是b,a mod b的公约数
假设d是b,a mod b的公约数, 则d|b,d|(a-k*b),k是一个整数。进而d|a.因此d也是a,b的公约数 因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
扩展
计算3个数的最大公约数
/****方法一:找到三个数中的最小的数,作为循环遍历的边界值**/const min = (a,b,c)=>{return Math.min(c,Math.min(a,b));}const gcdm = (a,b,c)=>{const n = min(a,b,c)if(n === 1) return n;let result = 1;for(let i = 2;i<=n;i++){if(a%i===0 && b%i === 0 && c%i === 0){result = i;}}return result;}console.log(gcdm(9,6,12));/****方法二:求出两个的最大公约数,再与第三个相求**/const gcd = (a, b) => {if (b === 0) {return a;}return gcd(b, a % b);}console.log(gcd(gcd(9,6),12));
类似习题:
总结
用辗转相除(欧几里得算法)计算两个数的最大公约数
