You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:24:35