• 面试问题之求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,落下了心头的一块石头...

  • 相关阅读:
    KEIL5.25生成.bin文件步骤
    【转】树莓派网线直连笔记本电脑
    由编译器指定数组长度带来的一个问题
    【转】C/C++位域结构深入解析
    【转】大小端存储模式精解
    【转】树莓派入门之装系统
    【转】树莓派Raspberry Pi
    stm32的双向io口
    小记之while循环条件的操作位置
    【转】浮点数在计算机中存储方式
  • 原文地址:https://www.cnblogs.com/xuejiangjun/p/10731298.html
Copyright © 2020-2023  润新知