zoukankan      html  css  js  c++  java
  • Smallest Common Multiple

    解法一:
    function smallestCommons(arr){
     var
    tag; var max = arr[0]>arr[1]?arr[0]:arr[1]; var min = arr[0]>arr[1]?arr[1]:arr[0];
    //给数组arr赋值。
     
    for(var i = 0;i<=max-min;i++){ arr[i]=min+i; } //判断某个数是否是质数。
    function isPrime(n){ if(n === 1){ return false; }else{ for(var i =2;i<n;i++){ if(n%i === 0){ return false; } } return true; } } var brr=[];
     //构造质数数组,质数数组最大值是传入数组的最大值。
     
    for(var j =2;j<=max;j++){ if(isPrime(j)){ brr.push(j); } }  //从最大质数开始依次去除用传入数组构造的arr数组的每一项值,如果除完最小质数2后还未除尽,调用此函数。 var crr=[]; function mul(){ for(var y =0;y<arr.length;y++){ if(arr[y]%2 === 0){ arr[y]=arr[y]/2; tag = true; } } if(tag){ crr.push(2); } }
      //从最大质数开始依次去除传入数组构造的arr数组的每一项值,如果有可除的数则将质数保存到crr中,并将arr中的值改除掉后的值。
    for(var x = brr.length-1;x>=0;x--){ for(var y =0;y<arr.length;y++){ if(arr[y]%brr[x] === 0){ arr[y]=arr[y]/brr[x]; tag = true; } } if(tag){ crr.push(brr[x]); } }  //判断是否除尽,如果只有两个质数(即2和3)表示已除尽。 function isDown(b){ var count; for(var z =0;z<b.length;z++){ if (isPrime(b[z])){ count += 1; } } if (count ===2){ return true; }else{ return false; } } if(!isDown(arr)){
      mul(arr);
      }
    
    
      var drr=arr.concat(crr);
    
    
      return drr.reduce(function(a,b){
        return a*b;
      });
    }

     解法二:

    function smallestCommons(arr) {
      var max = arr[0]>arr[1]?arr[0]:arr[1];
      var min = arr[0]>arr[1]?arr[1]:arr[0];
      var brr=[];
      function math(n){
         return n>1?n*math(n-1):1;
      }
      //return math(max);
      for(var j = min;j<=max;j++){
        for(var x=2;x<=math(max);x++){
          brr.push(j*x);
        }    
      }
      /*function compare(a,b){
        if(a<b){
          return -1;
        }else if(a>b){
          return 1;
        }else{
          return 0;
        }
      }
      brr.sort(compare);*/
      var count = 0;
      for(var i=0;i<brr.length;i++){
        var aa = brr[i];
        //return aa;
        for(var z=0;z<brr.length;z++){
          if(brr[z] === aa){
            count += 1;  
          }
        }
        /*if(brr[i] === brr[i+1]){
          count +=1;
        }else{
          count = 0;
        }*/
        if (count === max-min+1){
          return aa;
        }else{
          count= 0;
        }
      }
    }

    这种解法只适用于小数字,当求13个数的最小公倍数时,在第9行和第25行会出现无限循环。报错内容如下:

    解法三:最大公约数法(此种最简便,速度最快)

    function smallestCommons(array) {
        var range = createRange(array);
    
        return range.reduce(function(a, b) {
            return lcm(a, b);
        });
    
        function lcm(a, b) {
            return (Math.abs(a * b) / gcd(a, b));
        }
    
        function gcd(a, b) {
            var temp;
            while (b != 0) {
                temp = b;
                b = a % b;
                a = temp;
            }
            return a;
        }
    
        function createRange(array) {
            var range = [];
            var highest = array.reduce(function(a, b) {
                return Math.max(a, b);
            });
            var lowest = array.reduce(function(a, b) {
                return Math.min(a, b);
            });
            for (var i = lowest; i <= highest; i++) {
                range.push(i);
            }
            return range;
        }
    }
  • 相关阅读:
    正则表达式速查表
    Python第三方库管理Anaconda
    Python3.x和Python2.x的区别
    python 学习 “笨办法学python”(随书补充)
    python 中文输入的注意事项
    mongodb update 字符 操作(补充)
    mongodb update 字符 操作
    04.视频播放器通用架构实践
    05.视频播放器内核切换封装
    03.视频播放器Api说明
  • 原文地址:https://www.cnblogs.com/antstory/p/6417931.html
Copyright © 2011-2022 走看看