关闭

HDU 1431 素数回文

标签: ACMHDU
348人阅读 评论(0) 收藏 举报
分类:

素数回文

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 15054    Accepted Submission(s): 3360


Problem Description
xiaoou33对既是素数又是回文的数特别感兴趣。比如说151既是素数又是个回文。现在xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a 跟b 之间满足条件的数。(5 <= a < b <= 100,000,000); 
 

Input
这里有许多组数据,每组包括两组数据a跟b。
 

Output
对每一组数据,按从小到大输出a,b之间所有满足条件的素数回文数(包括a跟b)每组数据之后空一行。
 

Sample Input
5 500
 

Sample Output
5 7 11 101 131 151 181 191 313 353 373 383
 



注意:
1:数组开大,MLE 超内存
2:在1-1亿 素数回文最大是9989899  <1000W
3:输入 a b 时,由于开的数组为1000W+10,所以  B的输入限制应该在1000W+10 否则会WA
4:bool 型 初始为false =0;并且 sizeof(bool)=1;也就是字节为  1 



  1. #include<stdio.h>  
  2. #include<string.h>  
  3. #include<stdbool.h>  
  4. bool hash[10000010];  
  5. int biao (void)  
  6. {  
  7.     int j,i;  
  8.     int a,b,sum;  
  9.     memset(hash,0,sizeof(hash));  
  10.     for(i=0; i<=10000000; i++)  
  11.     {  
  12.         a=i;  
  13.         sum=0;  
  14.         while(a)  
  15.         {  
  16.             sum=sum*10+a%10;  
  17.             a=a/10;  
  18.         }  
  19.         if(sum==i)  
  20.         {  
  21.             hash[i]=1;  
  22.         }  
  23.         if(hash[i]==1)  
  24.         {  
  25.             for(j=2; j*j<=i; j++)  
  26.             {  
  27.                 if(i%j==0)  
  28.                 {  
  29.                     hash[i]=0;  
  30.                 }  
  31.             }  
  32.         }  
  33.     }  
  34. }  
  35. int main (void)  
  36. {  
  37.     int a,b,i;  
  38.     biao();  
  39.     while(~scanf("%d%d",&a,&b))  
  40.     {  
  41.         for(i=a; i<=b&&i<10000000; i++)  
  42.         {  
  43.             if(hash[i])  
  44.             {  
  45.                 printf("%d\n",i);  
  46.             }  
  47.         }  
  48.         printf("\n");  
  49.     }  
  50.     return 0;  
  51. }  


5:高效素数判断法
  1. /* 
  2. 题目给的范围里最大的回文素数就是9989899,所以数组只要开到这个数就够了 
  3. */  
  4. #include<stdio.h>      
  5. bool isp[9989900];     
  6. int p[1000]; //p用来存回文素数表    
  7. void set()  //如果 i 是素数,then isp[i]=fasle, else isp[i]=true;   
  8. {   //高效判断素数法:所有和数都==N个素数的乘积  
  9.     int i,j;     
  10.     //for(i=5;i<=3163;i++)     
  11.       //  isp[i]=0;  由于bool类型默认值是false ,所以可以注释掉  
  12.       i=2;  
  13.       for(j=i*i;j<=9989899;j+=i)     
  14.             isp[j]=true;   
  15.     for(i=3;i<=3163;i=i+2)     
  16.     {     
  17.         if(isp[i])continue;     
  18.         for(j=i*i;j<=9989899;j+=i)     
  19.             isp[j]=true;     
  20.     }     
  21. }     
  22. bool test(int a) //判断a 是不是回文数    
  23. {     
  24.     int temp=a;     
  25.     int b=0;     
  26.     while(temp!=0)     
  27.     {     
  28.         b=b*10;     
  29.         b+=temp%10;     
  30.         temp/=10;     
  31.     }     
  32.     return a==b;     
  33. }     
  34. int main()     
  35. {     
  36.     int a,b;     
  37.     int i,k=0;     
  38.     set();     
  39.     for(i=5;i<=9989899;i+=2)     
  40.         if(!isp[i] && test(i))     
  41.             p[k++]=i;     
  42.     while(scanf("%d%d",&a,&b)!=EOF)     
  43.     {     
  44.         for(i=0;i<k;i++)     
  45.         {     
  46.             if(p[i]<a)     
  47.                 continue;     
  48.             else if(p[i]<=b)     
  49.                 printf("%d\n",p[i]);     
  50.             else    
  51.                 break;     
  52.         }     
  53.         printf("\n");     
  54.     }     
  55.     return 0;     
  56. }  


  
//回文数的对称性
bool huiwen(int a)
{
    int b[44];
    int l=0,i;
    int c=a;
    while(a)
    {
        b[l++]=a%10;
        a/=10;
    }
    for(i=0;i<l/2;i++)
    {
        if(b[i]!=b[l-1-i])
            break;
    }
    if(i==l/2 )
        return 1;
    else
        return 0;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:702920次
    • 积分:5196
    • 等级:
    • 排名:第5580名
    • 原创:212篇
    • 转载:25篇
    • 译文:0篇
    • 评论:92条
    博客专栏
    最新评论