首页 > 试题广场 >

请求出第20个丑数。(最小因子只有2、3、5的数,称作丑数(

[问答题]

请求出第20个丑数。(最小因子只有2、3、5的数,称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7,习惯上我们把1当做是第一个丑数);

 输入:getUglyNumber(20)

输出:36

function sortNumber(a, b) {
return a - b
}
var num = [1];
function getUglyNumber(index) {
for (let i = 0; i <= index * 2; i++) {
num.push(num[i] * 2);
num.push(num[i] * 3);
num.push(num[i] * 5);
}
num.sort(sortNumber);

var l = num.length;
var arr = [];
for (var i = 0; i < l; i++) {
if (arr.indexOf(num[i]) == -1) {
arr.push(num[i]);
}
}
console.log(arr[index - 1]);
return arr;
}
getUglyNumber(20);
发表于 2019-06-25 01:58:56 回复(1)
        /*
        思路:
        1.按顺序将丑数保存在数组中,然后求下一个丑数;
        2.下一个丑数是由数组中某个丑数A * 2,B * 3,C * 5中的最小值得来的。
        3.按照题目规定,第一个丑数是1,存入数组中;
        4.第二个丑数为1*2,1*3,1*5三个中的最小值;
        5.第三个丑数为2*2,1*3,1*5三个中的最小值,依次类推,求出第N个数组。
        */
        function getUglyNumber(index){
            if(index === 0) return 0;

            var uglyArr = [1];
            // var index = prompt('请输入一个整数');
            // var index = 20;
            var factor2=0,//定义三个因数
                factor3=0,
                factor5=0;
            for(var i=1;i<index;i++){
                uglyArr[i] = Math.min(uglyArr[factor2]*2,uglyArr[factor3]*3,uglyArr[factor5]*5);
                if(uglyArr[i] === uglyArr[factor2]*2) factor2++;
                if(uglyArr[i] === uglyArr[factor3]*3) factor3++;
                if(uglyArr[i] === uglyArr[factor5]*5) factor5++;
            }
            return  uglyArr[index-1];
        }
        console.log(getUglyNumber(20));
        console.log(getUglyNumber(0));
        console.log(getUglyNumber(1));

发表于 2019-08-16 17:41:01 回复(0)
function getUglyNumber(n) {
  const memo = [1, 2, 3, 4, 5];
  let i = 6;
  while (memo.length < n) {
    let result = Math.min(
      ...[i / 2, i / 3, i / 5].filter((x) => Number.isInteger(x))
    );
    if (memo.includes(result)) {
      memo.push(i);
    }
    i++;
  }
  return memo[n - 1];
}
发表于 2020-06-25 13:33:18 回复(1)
//最简洁的答案
var nthUglyNumber = function(n) {
    if(n===1return 1
    let list = [1];
    let a = 0;
    let b = 0;
    let c = 0;
    for(let k=1;k<n;k++){
        list[k] = Math.min(list[a]*2,list[b]*3,list[c]*5)
        if(list[k]===list[a]*2) a++
        if(list[k]===list[b]*3) b++
        if(list[k]===list[c]*5) c++
    }
    return list[n-1];
};
发表于 2020-08-27 18:39:41 回复(0)