【华为OD机试真题】【2024年E卷】天生回文素数-模仿(C++/Java/Python)

[复制链接]
发表于 2025-12-4 09:03:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
分值:100

标题形貌

求出大于或便是 N 的最小回文素数Q。
回首一下,假如一个数大于 1,且其因数只有1和它自身,那么这个数是素数。
比方,2,3,5,7,11以及 13 是素数。
回首一下,假如一个数从左往石读与从右往左读是一样的,那么这个数是回文数Q比方,12321 是回文数。
输入形貌:
一个数字 N。
输出形貌:
一个大于或便是 N 的最小回文素数Q。
   示例1
输入:
6
输出:
7
表明: 大于或便是 6 的最小回文素数7。
    示例2
输入:
8
输出:
11
  Tips:


  • 1 <= N <= 1e8
  • 测试用例包管答案总是存在,而且在 [2, 2 * 108] 范围内
思绪



  • “偶数长度的回文数”中只有11是素数,其他的都可以被11整除。以是可以直接跳过偶数长度的回文数(除了 11)。
  • 跳过 1e7 ~ 1e8 这段数字远比跳过1e5~1e6…这些加起来多得多,复杂度优化重要会合在跳过1e7 ~ 1e8这段。固然,也可以特判其他长度的数字举行跳过,只是影响不大。
  • 思绪参考自866. 回文质数力扣官方题解
复杂度分析



  • 时间复杂度:                                    O                         (                         N                         )                              O(N)                  O(N),此中N为数字巨细
  • 空间复杂度:                                    O                         (                         1                         )                              O(1)                  O(1)
AC 代码

C++ 版
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int primePalindrome(int N) {
  4.     while (true) {
  5.         if (N == reverse(N) && isPrime(N)) {
  6.             return N;
  7.         }
  8.         N++;
  9.         // 知识点: “偶数长度的回文数”中只有11是素数,其他的都可以被11整除。所以可以直接跳过偶数长度的回文数(除了 11)。
  10.         //
  11.         if (1e7 < N && N < 1e8) {
  12.             N = 1e8;
  13.         }
  14.     }
  15. }
  16. bool isPrime(int N) {
  17.     if (N < 2) return false;
  18.     int R = static_cast<int>(sqrt(N));
  19.     for (int d = 2; d <= R; ++d)
  20.         if (N % d == 0) return false;
  21.     return true;
  22. }
  23. int reverse(int N) {
  24.     int ans = 0;
  25.     while (N > 0) {
  26.         ans = 10 * ans + (N % 10);
  27.         N /= 10;
  28.     }
  29.     return ans;
  30. }
  31. int main()
  32. {
  33.     int n;
  34.     cin >> n;
  35.     cout << primePalindrome(n);
  36.     return 0;
  37. }
复制代码
JAVA 版
  1. import java.util.Scanner;
  2. public class PrimePalindrome {
  3.     public static void main(String[] args) {
  4.         Scanner scanner = new Scanner(System.in);
  5.         int n = scanner.nextInt();
  6.         System.out.println(primePalindrome(n));
  7.         scanner.close();
  8.     }
  9.     public static int primePalindrome(int N) {
  10.         while (true) {
  11.             if (N == reverse(N) && isPrime(N)) {
  12.                 return N;
  13.             }
  14.             N++;
  15.             if (1e7 < N && N < 1e8) {
  16.                 N = (int) 1e8;
  17.             }
  18.         }
  19.     }
  20.     public static boolean isPrime(int N) {
  21.         if (N < 2) return false;
  22.         int R = (int) Math.sqrt(N);
  23.         for (int d = 2; d <= R; ++d)
  24.             if (N % d == 0) return false;
  25.         return true;
  26.     }
  27.     public static int reverse(int N) {
  28.         int ans = 0;
  29.         while (N > 0) {
  30.             ans = 10 * ans + (N % 10);
  31.             N /= 10;
  32.         }
  33.         return ans;
  34.     }
  35. }
复制代码
Python 版
  1. import math
  2. def primePalindrome(N):
  3.     def isPrime(num):
  4.         if num < 2:
  5.             return False
  6.         for i in range(2, int(math.sqrt(num)) + 1):
  7.             if num % i == 0:
  8.                 return False
  9.         return True
  10.     def reverse(num):
  11.         reversed_num = 0
  12.         while num > 0:
  13.             reversed_num = reversed_num * 10 + num % 10
  14.             num //= 10
  15.         return reversed_num
  16.     while True:
  17.         if N == reverse(N) and isPrime(N):
  18.             return N
  19.         N += 1
  20.         if 1e7 < N < 1e8:
  21.             N = int(1e8)
  22. n = int(input())
  23. print(primePalindrome(n))
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表