USACO 回文素数

来源:互联网 发布:蒙顶甘露 知乎 编辑:程序博客网 时间:2024/06/16 13:39

输出【a,b】间既是回文数,又是素数的个数(5 <= a < b <= 10^8)

素数筛选法 枚举素数判断是否回文,超时超空间。所以可以先判断回文,再判断素数,因为回文数数量比素数少,但还是要开大数组。

所以用其他方法:除2外偶数肯定不是素数,除5外5结尾的肯定不是素数,除11外数字长度为偶数的不会同时是素数和回文数,因为是回文数的会被11整除

一个很大的优化是:从偶数长度的数跳到奇数长度的数,如判断1100不合条件,直接跳到10001判断

大量参考别人的博客

#include<stdio.h>int ishuiwen(int i){//判断回文int m,n;n = i;m = 0;while(n){m = m * 10 + n % 10;n /= 10;}if(m == i)return 1;return 0;}int isprime(int m){int i;for(i=3;i*i<=m;i+=2){//+=2直接避开偶数if( m % i ==0 )return 0;}return 1;}int word_len(int x){//求数字长度int res = 0;while(x){res++;x /= 10;}return res;}int ten_up(int m){//变下一个10的倍数int i,s = 10;//求10^mfor(i=1;i<m;i++)s*=10;return s;}int main(){int i,l,r,count;//freopen("in.txt","r",stdin);int len;while(scanf("%d%d",&l,&r)!=EOF){count = 0;for(i=l;i<=r;i++){if( i % 2 == 0 && i != 2 )//除2外偶数不是素数continue;if( i % 5 == 0 && i != 5)//除5外5倍数不是素数continue;if(!ishuiwen(i))continue;len = word_len(i);if( len % 2 == 0 && i != 11){//除11外数字长度为偶数的不是回文数i = ten_up(len);//这招牛,从偶数长度跳到奇数长度continue;//下一轮是因为i++到了101之类带1而不是0结尾的}if(isprime(i))count++;}printf("%d\n",count);}return 0;}


0 0