如何用JavaScript编写回文代码及求两位五位数素数乘积最大回文
关于JavaScript回文代码与五位数素数乘积最大回文数的解决方案
嘿,别慌!我来一步步帮你理清这两个问题——先从回文的基础代码讲起,再搞定那个找最大回文数的难题。
一、JavaScript中的回文相关基础代码
回文指的是正读和反读完全相同的字符串或数字,下面是几种常见的判断和处理方式:
1. 判断字符串是否为回文
最直观的思路是把字符串反转后和原串对比,同时可以先统一格式(比如大小写、去掉非有效字符):
function isPalindrome(str) { // 预处理:转小写,移除非字母数字字符(根据需求可选) const processedStr = str.toLowerCase().replace(/[^a-z0-9]/g, ''); // 反转字符串 const reversedStr = processedStr.split('').reverse().join(''); // 对比判断 return processedStr === reversedStr; } // 测试示例 console.log(isPalindrome("A man, a plan, a canal: Panama")); // 输出 true console.log(isPalindrome("race a car")); // 输出 false
2. 判断数字是否为回文
可以转字符串处理,也可以用纯数学方法反转数字(避免类型转换):
// 方法1:转字符串处理 function isPalindromeNumber(num) { const numStr = num.toString(); return numStr === numStr.split('').reverse().join(''); } // 方法2:纯数学反转(适合对性能要求高的场景) function isPalindromeNumberMath(num) { if (num < 0) return false; // 负数不可能是回文 let originalNum = num; let reversedNum = 0; while (num > 0) { reversedNum = reversedNum * 10 + num % 10; num = Math.floor(num / 10); } return originalNum === reversedNum; } // 测试示例 console.log(isPalindromeNumber(121)); // 输出 true console.log(isPalindromeNumberMath(12321)); // 输出 true console.log(isPalindromeNumber(123)); // 输出 false
二、找出两个五位数素数相乘的最大回文数及乘数
这个问题需要拆解成三个核心步骤:素数判断、回文判断、高效遍历找最大值。直接暴力遍历所有五位数组合会很慢,所以我们要做一些优化。
1. 高效素数判断函数
五位数范围是10000~99999,为了减少计算量,我们优化素数判断逻辑:只遍历到平方根,跳过偶数(除了2):
function isPrime(num) { if (num <= 1) return false; if (num === 2) return true; if (num % 2 === 0) return false; // 偶数除了2都不是素数 // 只遍历奇数到平方根,减少循环次数 for (let i = 3; i <= Math.sqrt(num); i += 2) { if (num % i === 0) return false; } return true; }
2. 寻找最大回文数的核心逻辑
我们从最大的五位数开始倒序遍历,同时加入优化条件减少不必要的计算:
- 外层循环从99999开始,当当前数的平方小于已找到的最大回文时,直接终止循环(因为再往下乘不可能得到更大的数)
- 内层循环从当前外层数开始(避免重复计算ij和ji),如果乘积小于当前最大回文,直接终止内层循环
- 一旦找到符合条件的回文,就更新最大值并记录乘数,继续找更大的可能
function findLargestPalindromeFromTwoFiveDigitPrimes() { let maxPalindrome = 0; let primeFactors = []; // 从最大的五位数倒序遍历到最小的五位数 for (let i = 99999; i >= 10000; i--) { // 优化:如果当前i的平方已经小于已知最大回文,后续乘积不可能更大,直接跳出 if (i * i < maxPalindrome) break; // 内层从i开始,避免重复计算(比如99999*99998和99998*99999是同一个乘积) for (let j = i; j >= 10000; j--) { const product = i * j; // 优化:如果乘积已经小于当前最大回文,不用判断回文,直接跳出内层循环 if (product < maxPalindrome) break; // 同时满足:乘积是回文、两个数都是素数 if (isPalindromeNumber(product) && isPrime(i) && isPrime(j)) { maxPalindrome = product; primeFactors = [i, j]; // 找到当前i对应的最大回文,跳出内层循环,继续下一个i break; } } } return { largestPalindrome: maxPalindrome, primeFactors: primeFactors }; } // 执行并输出结果 const result = findLargestPalindromeFromTwoFiveDigitPrimes(); console.log(`找到的最大回文数:${result.largestPalindrome}`); console.log(`对应的两个五位数素数:${result.primeFactors[0]} 和 ${result.primeFactors[1]}`);
代码运行说明
运行这段代码后,会输出由两个五位数素数相乘得到的最大回文数,以及对应的两个素数。因为我们是从大到小遍历并加入了多层优化,所以运行效率会比暴力遍历高很多。
内容的提问来源于stack exchange,提问作者Naturo Power
相关产品推荐
相关产品推荐

