NOI-OJ 1.13 ID:5 素数回文数的个数

整体思路

  • 使用埃拉拖色尼算法提前计算出1000以内的素数表。

  • 设计一个回文判断函数isHW(int n),难点在于数字回文的判断。一个简单的方法是将数字n使用sprintf输出在一个数组中,然后从数组的头和尾开始进行逐一对比。

著名金融家“索罗斯”的名字“SOROS”就是一个回文字串。

例程

#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
bool ss[10001];				//素数表
int  count;					//计数器

void altsn(int N){			//埃拉拖色尼算法
	ss[0]=1;
	ss[1]=1;
	int p=2;
	while(p<=sqrt(N))
		if(ss[p]) p++;
		else{
			int times=2;
			while(p*times<=N)	{ ss[p*times]=1; times++;}
			p++;
		}
}

bool isP(int n){			//素数判断函数
	if(!ss[n])	return true;
	return false;
}

bool isHW(int n){			//回文判断函数
	char s[10];
	int  len, i, j;
	sprintf(s, "%d", n);	//将n输出值数组中
	len=strlen(s);
	for(i=0, j=len-1; s[i]==s[j] && i<j; i++,j--) ;	//注意这个循环
	if(i==j || (j+1)==i)	return true;			//注意成为回文的条件
	return false;
}

int main(){
	int N;
	cin>>N;
	altsn(N);
	for(int i=11; i<=N; i++)						//从11~N依次判断
		if(isP(i) && isHW(i))	count++;			//是素数且是回文
	printf("%d", count);
	return 0;
}
posted @ 2017-04-12 09:39  LFYZOI题解  阅读(880)  评论(0编辑  收藏  举报