素数回文数 C++题解

素数回文数

内存限制: 256 MiB 时间限制: 1000 ms 标准输入输出 题目类型: 传统 评测方式: 文本比较

题目描述

如果一个数从左边读和右边读都是同一个数,就称为回文数,例如 686 就是一个回文数。编程求10 到 1000 内所有的既是回文数同时又是素数的自然数。

输入格式

输出格式

若干个数 每行一个

#include <bits/stdc++.h>
using namespace std;
bool prime(int x) {
	if(x <= 1) {
		return false;
	} 
	for(int i = 2; i * i <= x; i++) {
		if(x % i == 0) {
			return false;
		} 
	} 
	return true;
} 
bool hui(int x) {
	int a = 0, b = x;
	while(x != 0) {
		a = a * 10 + x % 10;
		x /= 10;
	} 
	if(b == a) {
		return true;
	} 
	return false;
} 
int main() {
	for(int i = 10; i <= 1000; i++) {
		if(prime(i) == true && hui(i) == true) {
			printf("%d\n", i);
		} 
	} 
	return 0;
} 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最长回文子串问题可以使用中心扩展算法或者Manacher算法来解决。 中心扩展算法的思路是从每个字符作为回文中心向两边扩展,记录下最长的回文子串。具体实现如下: ```c #include <stdio.h> #include <string.h> #define MAX_LEN 100 void longestPalindrome(char s[]) { int left, right, len, maxLen = 1, start = 0; int n = strlen(s); for (int i = 0; i < n; i++) { // 以i为中心向两边扩展 len = 1; left = i - 1; right = i + 1; while (left >= 0 && s[left] == s[i]) { left--; len++; } while (right < n && s[right] == s[i]) { right++; len++; } while (left >= 0 && right < n && s[left] == s[right]) { left--; right++; len += 2; } if (len > maxLen) { maxLen = len; start = left + 1; } } printf("The longest palindrome substring is: "); for (int i = start; i < start + maxLen; i++) { printf("%c", s[i]); } } int main() { char s[MAX_LEN]; printf("Enter a string: "); scanf("%s", s); longestPalindrome(s); return 0; } ``` Manacher算法是一种优化的算法,其时间复杂度为O(n),更快速地求解最长回文子串。具体实现如下: ```c #include <stdio.h> #include <string.h> #define MAX_LEN 100 void longestPalindrome(char s[]) { int n = strlen(s); char t[MAX_LEN * 2 + 1]; int p[MAX_LEN * 2 + 1]; int center = 0, maxRight = 0, maxLen = 1, start = 0; // 构造新字符串t for (int i = 0; i < n; i++) { t[2 * i] = '#'; t[2 * i + 1] = s[i]; } t[2 * n] = '#'; int len = 2 * n + 1; // 求解p数组 for (int i = 0; i < len; i++) { if (i < maxRight) { p[i] = p[2 * center - i] < maxRight - i ? p[2 * center - i] : maxRight - i; } else { p[i] = 1; } while (i - p[i] >= 0 && i + p[i] < len && t[i - p[i]] == t[i + p[i]]) { p[i]++; } if (i + p[i] > maxRight) { maxRight = i + p[i]; center = i; } if (p[i] > maxLen) { maxLen = p[i]; start = (i - maxLen + 1) / 2; } } printf("The longest palindrome substring is: "); for (int i = start; i < start + maxLen - 1; i++) { printf("%c", s[i]); } } int main() { char s[MAX_LEN]; printf("Enter a string: "); scanf("%s", s); longestPalindrome(s); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值