现在的位置: 首页 > 综合 > 正文

hdu 1431 素数回文

2018年01月12日 ⁄ 综合 ⁄ 共 1411字 ⁄ 字号 评论关闭

分析:先生成回文数,在判断是不是质数;生成回文数的方法很巧妙,在网上找的资料

#include<iostream>
#include<cstdio>
#include<math.h>
using namespace std;

int palind_prime[10000];
bool is_prime(int a)
{
	for(int i=2;i<=(int)sqrt(a+0.5);i++)
	{
		if(a%i==0)
			return false;
	}
	return true;
}
int main()
{
   int c=1,temp; 
   for(int i=5;i<=9;i++)//一位数
   {
      temp=i;
	  if(is_prime(temp))
		  palind_prime[c++]=temp;
   }
   for(int i=1;i<=9;i++)//两位数
   {
	   temp=11*i;
	   if(is_prime(temp))
		   palind_prime[c++]=temp;
   }
   for(int i=1;i<=9;i++)//三位数
   {
	   for(int j=0;j<=9;j++)
	   {
	      temp=101*i+10*j;
	      if(is_prime(temp))
		      palind_prime[c++]=temp;
	   }
   }
   for(int i=1;i<=9;i++)//四位数
   {
	   for(int j=0;j<=9;j++)
	   {
	      temp=1001*i+110*j;
	      if(is_prime(temp))
		      palind_prime[c++]=temp;
	   }
   }
   for(int i=1;i<=9;i++)//五位数
	   for(int j=0;j<=9;j++)
		   for(int k=0;k<=9;k++)
		   {
			   temp=10001*i+1010*j+100*k;
			   if(is_prime(temp))
				   palind_prime[c++]=temp;
		   }
   for(int i=1;i<=9;i++)//六位数
	   for(int j=0;j<=9;j++)
		   for(int k=0;k<=9;k++)
		   {
			   temp=100001*i+10010*j+1100*k;
			   if(is_prime(temp))
				   palind_prime[c++]=temp;
		   }
  for(int i=1;i<=9;i++)//七位数
	   for(int j=0;j<=9;j++)
		   for(int k=0;k<=9;k++)
		       for(int t=0;t<=9;t++)
		      {
			      temp=1000001*i+100010*j+10100*k+1000*t;
			      if(is_prime(temp))
			 	   palind_prime[c++]=temp;
		     }
    /*
   printf("%d\n\n",c-1);
   for(int i=1;i<c;i++)
   {
	   printf("%d  ",palind_prime[i]);
	   if(i%10==0)
		   printf("\n");
   }*/
   int a,b;
   while(scanf("%d %d",&a,&b)!=EOF)
   {
	   int left,right;
       for(int i=1;i<c;i++)
		  if(palind_prime[i]>=a)
		  {
			 left=i;
			 break;
		  }
	   for(int i=c-1;i>=1;i--)
		   if(palind_prime[i]<=b)
		   {
			   right=i;
			   break;
		   }
	   for(int i=left;i<=right;i++)
		   printf("%d\n",palind_prime[i]);
	   printf("\n");
   }
    system("pause");
	return 0;
}

抱歉!评论已关闭.