题目地址:最简分数

解题思路

因为要求值要在(0,1)之内,所以分子要比分母小,根据示例,罗列了一下,当

n = 6

应该输出:

image.png
因为要求分子和分母是最简分数,也就是🈯️:分子和分母的最大公约数是1,所以第一版本代码

代码

  1. /**
  2. * @param {number} n
  3. * @return {string[]}
  4. */
  5. var simplifiedFractions = function(n) {
  6. const result = [];
  7. if(n>1){
  8. for(let i = 1;i<n;i++){
  9. for(let j = i+1;j<=n;j++){
  10. let flag = false;
  11. if(i !== 1){
  12. let c = i;
  13. while(c>1){
  14. if(j % c == 0 && i % c == 0){
  15. flag = true;
  16. break;
  17. }
  18. c--;
  19. }
  20. }
  21. if(!flag || i === 1){
  22. result.push(`${i}/${j}`);
  23. }
  24. }
  25. }
  26. }
  27. return result;
  28. };
  29. const key = 8;
  30. console.log(simplifiedFractions(key));

官方题解

官方题解,在求取两个数的最大公约数时,可以用辗转相除(欧几里得算法)

  1. var simplifiedFractions = function(n) {
  2. const ans = [];
  3. for (let denominator = 2; denominator <= n; ++denominator) {
  4. for (let numerator = 1; numerator < denominator; ++numerator) {
  5. if (gcd(numerator, denominator) == 1) {
  6. ans.push(numerator + "/" + denominator);
  7. }
  8. }
  9. }
  10. return ans;
  11. };
  12. const gcd = (a, b) => {
  13. if (b === 0) {
  14. return a;
  15. }
  16. return gcd(b, a % b);
  17. }

证明如下:

假设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个数的最大公约数

  1. /***
  2. *方法一:找到三个数中的最小的数,作为循环遍历的边界值
  3. **/
  4. const min = (a,b,c)=>{
  5. return Math.min(c,Math.min(a,b));
  6. }
  7. const gcdm = (a,b,c)=>{
  8. const n = min(a,b,c)
  9. if(n === 1) return n;
  10. let result = 1;
  11. for(let i = 2;i<=n;i++){
  12. if(a%i===0 && b%i === 0 && c%i === 0){
  13. result = i;
  14. }
  15. }
  16. return result;
  17. }
  18. console.log(gcdm(9,6,12));
  19. /***
  20. *方法二:求出两个的最大公约数,再与第三个相求
  21. **/
  22. const gcd = (a, b) => {
  23. if (b === 0) {
  24. return a;
  25. }
  26. return gcd(b, a % b);
  27. }
  28. console.log(gcd(gcd(9,6),12));

类似习题:

找出数组中的最大公约数

总结

用辗转相除(欧几里得算法)计算两个数的最大公约数