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));
我正在尝试编写一个程序来寻找完美和几乎完美 的数字。
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));