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

整体思路

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

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

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

例程

include

include

include

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(ptimes<=N) { ss[ptimes]=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题解  阅读(963)  评论(0)    收藏  举报