我正在尝试使用 javascript 获取数组中回文数的总和
代码得到输出 0 而不是得到回文值的总和:
function reverse(n) {
var rem, res = 0
while (n > 0) {
rem = n % 10
res = res * 10 + rem
n = n / 10
}
return res
}
function isPalindrome(n) {
if (n == reverse(n)) return true
}
function sumArray(arr) {
var sum = 0
for (var i = 0; i < arr.length; i++) {
if (arr[i] > 10 && isPalindrome(arr[i])) {
sum += arr[i]
}
}
console.log(sum);
}
sumArray([12, 313, 11, 44, 9, 1])
答案 0 :(得分:2)
您的 reverse
函数没有正确实现。例如,对于 12
,它给出 Infinity
。我认为更简单的方法是先将数字转换为字符串,然后反转字符串:
function isPalindrome(n) {
const str = String(n);
return str === [...str].reverse().join('');
}
function sumArray(arr) {
var sum = 0
for (var i = 0; i < arr.length; i++) {
if (arr[i] > 10 && isPalindrome(arr[i])) {
sum += arr[i]
}
}
console.log(sum);
}
sumArray([12, 313, 11, 44, 9, 1])
console.log( 313 +11+ 44);
或
function isPalindrome(n) {
if (n < 10) return false;
const str = String(n);
return str === [...str].reverse().join('');
}
function sumArray(arr) {
return arr
.filter(isPalindrome)
.reduce((a, b) => a + b, 0);
}
console.log(sumArray([12, 313, 11, 44, 9, 1]));
console.log( 313 +11+ 44);
答案 1 :(得分:1)
问题出在您的 reverse()
函数中。 n = n / 10
会留下一些乱七八糟的小数,导致循环无法终止。
while (n > 0) {
rem = n % 10
res = res * 10 + rem
n = n / 10
}
仅对这个结果进行四舍五入会使您的代码按预期运行。
while (n > 0) {
rem = n % 10
res = res * 10 + rem
n = Math.round(n / 10)
}
下面是四舍五入变化的代码
function reverse(n) {
var rem, res = 0
while (n > 0) {
rem = n % 10
res = res * 10 + rem
n = Math.round(n / 10)
}
return res
}
function isPalindrome(n) {
if (n == reverse(n)) return true
}
function sumArray(arr) {
var sum = 0
for (var i = 0; i < arr.length; i++) {
if (arr[i] > 10 && isPalindrome(arr[i])) {
sum += arr[i]
}
}
console.log(sum);
}
sumArray([12, 313, 11, 44, 9, 1])
答案 2 :(得分:1)
可以简化回文判断,用Array.reduce
求和
const isPalindrome = n =>
n > 10 && `${n}` === [...`${n}`].reverse().join("") ? n : 0;
const sumOfPalindromes = arr =>
arr.reduce((acc, val) => acc + isPalindrome(val), 0);
console.log(sumOfPalindromes([12, 313, 11, 44, 9, 1]));