质因数分解算法

问题描述 投票:0回答:1

这几天在研究算法, 我发现我的做法通常与其他人不同。

我是自学的,所以我没有任何导师或老师。 所以我非常担心“我与众不同可以吗”。 我很享受学习创建一些代码的时间, 但我不确定我能否像其他人一样做得很好并将我的逻辑结构与其他人相匹配, 这些天造成这种问题的原因。

您能告诉我我的问题到底是什么以及我该如何解决或改进自己吗?

这是来自某个网站的一个用于学习编码测试的问题。

🌿其他代码(通常人们都是这样解决的)

const solution = (n) => {
    var answer = [];
    let curNum = n;
    let count = 2;
    
    while (curNum !== 1) {
        if (curNum % count === 0) {
            answer.push(count)
            curNum = curNum/count
        } else {
            count++
        }
    }
    
    let check = [...new Set(answer)]
    
    return check 
}

🌱我的代码

const solution = (n) => {
  let result = n;
  let answer = [];
  const num = [2, 3, 5, 7];
  
  for( let i = 0; i < num.length; i ++ ){
    while( result >= 1 && result % num[i] === 0 ){
      answer.push(num[i]);
      result = result / num[i];

      if( result % num[i] !== 0){ 
        break;
      }
    }
  }  
  if( result !== 1 && Number.isInteger(Math.sqrt(result))) answer.push(Math.sqrt(result));
  else if( result !== 1) answer.push(result);
  
  return [...new Set(answer)].sort(((a, b) => a - b));
}

我是这样解决这个问题的, 因为我想如果“n”真的是一个很大的数字并且它有很多质因数, 那么就会有很多重复, 所以首先,我尝试去掉哪个是 [2, 3, 5, 7] 的倍数。 然后检查余数是否为平方数。

如果余数是平方数,则压平方根, 如果不推剩下的。

今天我听说“嵌套循环”不利于运行时间(它可以更长)。 所以我会越来越多地改进它。

我想问这样与别人不同的方式来解决问题可以吗

感谢您阅读这个长问题。

javascript algorithm logic
1个回答
0
投票

您提出的代码并不总是正确返回输入的素因数。

  1. 程序永远不能返回超过五个质因数(循环中四个,最后再返回一个)。但很明显,有些整数具有超过五个质因数。

  2. 您的代码假设如果循环后

    result
    仍然是非素数,则它一定是一个完全平方数。例如 143 就不是这样,它不是素数,也不是完全平方数。它应该被分解为因子 11 和 13,但您的代码没有检测到这些因子,并返回非素数 143。

  3. 另一方面,如果循环后

    result
    恰好是一个完全平方数,则该程序错误地假设其平方根将是素数。例如,14641 是 121 的完全平方,但 121 不是质数。然而,您的代码将返回它作为质因数,而它应该返回 11 作为质因数。

回到绘图板。

© www.soinside.com 2019 - 2024. All rights reserved.