一种算法,用于检查数字是否是javascript中的额外完美数字(它具有相同的第一位和最后一位)

时间:2018-04-18 21:56:33

标签: javascript algorithm

这看似显而易见,但究竟什么是一个额外的完美数字呢?我需要编写一个算法,从1到n找到给定n的额外完美。不幸的是,我似乎无法围绕问题措辞。这些是给出的例子:

extraPerfect(3)  ==>  return {1,3}
extraPerfect(7)  ==>  return {1,3,5,7}

任务: 给定正整数N,返回1到N范围内的额外完美数字。

如果一个数字具有相同的第一位和最后一位(设置位),则称为额外完全数。

注意: 1)只传递正整数。

2)返回的向量/列表应按升序包含额外的完美数字(从最低到最高)。 示例#1 extraPerfect(3)==>返回{1,3} 说明: (1)10 =(1)2 第一位和最后一位作为设置位。

(3)10 =(11)2 第一位和最后一位作为设置位。

示例#2 extraPerfect(7)==>返回{1,3,5,7} 说明: (5)10 =(101)2 第一位和最后一位作为设置位。

(7)10 =(111)2 第一位和最后一位作为设置位。

4 个答案:

答案 0 :(得分:2)

在我看来,一个额外的完全数只是一个奇数,因为在以 2 为底数时,它总是以 1 开始和结束,而偶数数字总是以 1 开头,以 0 结尾。

答案 1 :(得分:-1)

看起来 extraPerfect 应该返回一个小于参数的所有数字的列表,这些数字在将十进制参数转换为二进制后具有相同的第一个和最后一个数字。

例如:
十进制 - 二进制
1 - 1
2 - 10
3 - 11
4 - 100
5 - 101
6 - 110
7 - 111

您会注意到粗体值具有相同的第一个和最后一个二进制数字。

一些伪代码可能看起来像:

function extraPerfect( n ){
  var perfects = [];

  for(i=0; i<n; i++){
    var binary = toBinary(i);

    if(binary[0] === binary[binary.length]){
      perfects.push(i);
    }
  }

  return perfects;
}

您可以从伪代码中提取算法。

答案 2 :(得分:-1)

啊,现在我看到我错了,因为我认为这完全是关于palindroms。但是我希望它仍然有用。这是在1到提示值之间的部分代码。

var exns = (function(){
  function dec2bin(dec){
    return (dec >>> 0).toString(2);
  }
  function isEXN(num){
    var con = dec2bin(num); // 11011 = 3 + 24 = 27
    var accurate = Math.ceil(con.length/2); // 5/2 = 3
    var lenmin = con.length-1;
    for(var i = 0; i < accurate; i++){
      if(con.charAt(i) !== con.charAt(lenmin-i))
        return false;
    }
    return true;
  }

  var max = parseInt(prompt("Numbers from 1 to ...?"));
  var exns = [];
  if(!isNaN(max)){
    for(var i = 1; i<=max; i++){
      if(isEXN(i))
        exns.push(i);
    }
  }
  return exns;
})(); 

Exns应该包含带值的数组。

答案 3 :(得分:-1)

完美数字等于其正除数之和。

function perfect(num){
  for(var i=1,n=0; i<num; i++){
    if(num % i === 0){
      n += i; 
    } 
  }
  return n === num;
}
console.log(perfect(6));
console.log(perfect(7));
console.log(perfect(28));
console.log(perfect(8127));
console.log(perfect(8128));