易保研机试训练营-基础营|数学|D - 回文素数

题目

一个数如果从左往右读和从右往左读数字是相同的,则称这个数是回文数,如121,1221,15651都是回文数。给定位数n,找出所有既是回文数又是素数的n位十进制数。(注:不考虑超过整型数范围的情况)。

Input

位数n,其中1<=n<=9。

Output

第一行输出满足条件的素数个数。
第二行按照从小到大的顺序输出所有满足条件的素数,两个数之间用一个空格区分。

Sample Input

1

Sample Output

4
2 3 5 7

代码

#include <iostream>
#include <cmath>
#include <queue>
using namespace std;
bool issushu(int num) {
	if(num == 1)
		return false;
	else if(num == 2)
		return true;
	int i = 2;
	for(i = 2; i < sqrt(num) + 1; ++i)
		if(num % i == 0)
			break;
	if(i < sqrt(num) + 1)
		return false;
	else
		return true;		
}
int main() {
	int n;
	cin >> n;
	if(n == 1)
		cout << 4 << '\n' << 2 << ' ' << 3 << ' ' << 5 << ' ' << '7' << endl;
	else if(n == 2)
		cout << 1 << '\n' << 11 << endl;
	else if(n % 2 == 0)
		cout << 0 << endl;
	else {
		int i, j, k, l, ask;
		queue<int> que;
		n /= 2;
		for(i = pow(10, n - 1); i < pow(10, n); ++i) {
			for(l = 0; l < 10; ++l) {
				ask = l * pow(10, n) + i * pow(10, n + 1);
				k = i;
				j = n - 1;
				while(k != 0) {
					ask = ask + (k % 10) * pow(10, j);
					j--;
					k = k / 10;
				}
				if(issushu(ask))	
					que.push(ask);	
			}			
		}			
		cout << que.size() << endl;
		if(que.size()) {
			cout << que.front();
			que.pop();
		}
		while(!que.empty()) {
			cout << ' ' << que.front();
			que.pop();
		}	
	} 

	return 0;
}

卡题原因

1.一开始考虑用字符串模拟回文数生成,然而并不需要。
2.以为素数求解会超时,但并没有。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值