zoukankan      html  css  js  c++  java
  • 面试问题之求1-20内所有自然整数的最小乘积(最小公倍数)?

    首先,题目大概是:

    2520是1到10这个区间所有自然数的最小乘积,求1到20这个区间的所有自然数的最小乘积

    我理解为就是求最小公倍数。

    面试的时候没有写出来,但是我写了个思路就是用reduce来做,大意是 当前的值 = 当前乘积 % 当前值 == 0 ? 当前的值 : 当前的值 * 当前乘积。

    好像是不太明白,但我认为就是这个思路,当时没写出来,回家后写了一下,大致代码:

    var arr = [];
    for(var i = 1; i <= 10; i++){
      arr.push(i); //生成数组  
    }
    arr.reduce((a, b) => {
      return a % b == 0 ? a : a * b;
    })

    很奇怪,这里的答案是7560而不是2520,是哪里出了什么问题?而7560刚好是2520的3倍,百思不得其解啊。

    想了一天,和朋友们对了一下思路,发现是当前乘积取模当前值等于零这出了问题,因为当前值它如果不是质数,那么它就是由质数组成的,需要把它分解成组成它的质数。

    然后今天整理了一下,把代码写出来了:

    //将一个非质数分解成质数
    function
    getPrime(n) { var PrimeList = getPrimeList(n); var prime = n; for (var i = 0; i < PrimeList.length; i++) { if (n % PrimeList[i] == 0) { prime = PrimeList[i]; break; } } return prime; } // 获取1-n中的质数,将它们放到数组,成为质数数组 function getPrimeList(n) { var arr = []; for (var i = 2; i < n; i++) { var flag = true; for (var j = 2; j < i; j++) { if (i % j == 0) { flag = false; } } if (flag) { arr.push(i); } } return arr; } var arr = []; for (var i = 1; i <= 10; i++) { arr.push(i); } //当前值 = 当前乘积 % 当前值 == 0 ? 当前值 : 当前乘积 * 当前值组成的质数 //这里是当前值组成的质数而不是当前值 arr.reduce((accumulator, current) => { var prime = getPrime(current); return accumulator % current == 0 ? accumulator : accumulator * prime; }, 1);
    //2520

    那么看一下1至20的自然数的最小乘积呢,232792560,落下了心头的一块石头...

  • 相关阅读:
    python pip install 报错(SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)'))')排查
    JMeter中验证参数空格时,要勾选编码
    共阴数码管静态显示
    蜂鸣器与继电器的基本控制
    Linux常用命令(粤嵌)
    LED指示灯的基本控制
    单片机设计与开发——概述
    交叉编译器的安装方法
    正则表达式校验金额最多两位小数的实数
    thinkphp自定义分类样式
  • 原文地址:https://www.cnblogs.com/xuejiangjun/p/10731298.html
Copyright © 2011-2022 走看看