usaco1.5 pprime

本文介绍了一种递归生成特定范围内的回文素数的方法。通过控制数字的最低位及长度,采用递归策略生成回文数,并使用质数判断算法筛选出符合条件的回文素数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接


生成回文数并判断是否是素数

和analysis里面的几种生成方式都不同

是递归,但是感觉比analysis里面的那种递归low了很多,毕竟写得十分浅显...。

长度是奇数时,就把中间的那个数扩展成两个数

长度是偶数时,就用0-9尝试最中间的数

开始时控制最低位为1,3,5,7

结束时判断长度和大小关系

就是这样浅显...。


代码如下:

/*
ID: fan_0111
PROG: pprime
LANG: C++
*/
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#define maxn 1000
using namespace std;
int lenb = 0, tot = 0, c[11], ans[maxn], a, b;
void generate(int* c,int p,int x);
bool isprime(int x);
int main() {
	freopen("pprime.in","r",stdin);
	freopen("pprime.out","w",stdout);
	cin >> a >> b;
	int bb = b;
	while (bb > 0) {
		bb /= 10;
		++lenb;
	}
	if (a == 5) {
		ans[tot++] = 5;
	}
	c[0] = 1;
	generate(c,1,1);
	c[0] = 1;
	generate(c,1,3);
	c[0] = 1;
	generate(c,1,7);
	c[0] = 1;
	generate(c,1,9);
	sort(ans,ans+tot);
	for (int i=0;i<tot;++i) {
		cout << ans[i] << endl;
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}
void generate(int* c,int p,int x) {
	c[p] = x;
	int sum = 0;
	for (int i=1;i<=c[0];++i) {
		sum = sum*10 + c[i];
	}
//	cout << sum << endl;
	if (sum >= a && sum <= b && isprime(sum)) {
		ans[tot++] = sum;
	}
	int len = c[0];
	if (len == lenb) {
		return;
	}
	int j,k;
	++c[0];
	if (len % 2 == 0) {
		for (j=len+1;j>len/2+1;--j) {
			c[j] = c[j-1];
		}
		for (j=0;j<=9;++j) {
			generate(c,len/2+1,j);
		}
		for (j=len/2+1;j<=len;++j) {
			c[j] = c[j+1];
		}
	}
	else {
		for (j=len+1;j>len/2+2;--j) {
			c[j] = c[j-1];
		}
		generate(c,len/2+2,c[len/2+1]);
		for (j=len/2+2;j<=len;++j) {
			c[j] = c[j+1];
		}
	}
	--c[0];
}
bool isprime(int x) {
	for (int i=2;i<=floor(sqrt(x)+0.5);++i) {
		if (x%i == 0) {
			return false;
		}
	}
	return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值