Javascript 跳过未定义的相邻值

Javascript Skipping Adjacent Value as Undefined

我正在尝试编写一个程序来寻找完美和几乎完美 的数字。

var num = readline();

function sumDivisors(num){
  var sum = 0;
  for (var i = 1; i < num; i++){
    if (!(num % i)) {
      sum += i;
    }
  }
  if ( sum == num ) {
     print(num + " perfect");
   }
  if ( (sum - num == 2) || (sum - num == -2) ) {
     print(num + " almost perfect");
   }
  if ( ( sum != num ) && (sum - num != 2) && (sum - num != -2) ) {
     print(num + " not perfect");
   }
  while(readline()){
     sumDivisors(readline());
   }
}

print(sumDivisors(num));

它接受来自用户的大量输入,并输出 perfect 完美数字,almost perfect 几乎完美数字,以及不完美因为...好吧,你明白了。

样本Input/Output

我的问题:

我快到了。上面的代码似乎有效,除了一件事。 while 循环跳过相邻的值并将它们标记为 undefined.

例如,当我输入 6,43,2,650,28 时,输出将是 6 - 完美,[43 将被跳过],2 - 不完美,[650 将被跳过],28 - 完美, undefined.

有问题的输出

while(readline()){
  sumDivisors(readline());
}

这部分是问题所在。您读取一行以测试它是否结束,丢弃该行,如果不是,则读取下一行进行处理。保存结果并使用该行对除数求和。

由于循环内的递归,您还会有一个非常奇怪的行为。我建议您将循环提取到一个函数中,该函数调用另一个只处理一行的函数:

function findPerfectionInNumbers() {
  let line;
  while (line = readline()) {
    checkNumberForPerfection(line);
  }
}

并且您在其他函数中没有进行递归。

您在每个循环中调用 readline() 两次:

while(readline()){          // <-- here
   sumDivisors(readline()); // <-- again here
}

由于您没有对第一个号码执行任何操作,它只是从列表中删除该号码。一个简单的解决方法是将结果保存在 while() 测试中:

while((n = readline())){
   sumDivisors(n);
}

或更好:

if((n = readline())){ // <-- you don't need a loop here since you have recursion
   sumDivisors(n);
}

您还在 sumDivisors() 上调用 print,但 return 没有任何作用:print(sumDivisors(num)); 这就是为什么您在 undefined 行中你的输出。

您不需要一直迭代到目标数字。涨到一半就好了,Math.floor(n/2)。也没有完全奇数,所以你只能迭代偶数。但是,由于您也检查了几乎完美的结果,因此我通过了这个节省时间的方法。据此您可以进行如下操作;

function isPerfect(n){
  var target = Math.floor(n/2),
      sum    = Array.from({length: target})
                    .reduce((s,_,i) => n%(i+1) ? s : s += i+1, 0);
  return sum === n ? "perfect number"
                   : Math.abs(sum-n) < 3 ? "almost perfect number"
                                         : "not a perfect number";
}

console.log(isPerfect(33550336));