4.3 循环结构程序设计案例(3)

例 4-14

回文质数(洛谷P1217,USACO Training)

因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。

写一个程序来找出范围 a,b( 一亿)间的所有回文质数。

输入格式

第 1 行: 二个整数 a 和 b .

输出格式

输出一个回文质数的列表,一行一个。

输入输出样例

输入 输出
5 500 5
7
11
101
131
151
181
191
313
353
373
383

解答

#include<iostream>
using namespace std;

int main()
{
    int a,b;
    cin>>a>>b;
    if(a<=5 && b>=5)
        cout<<5<<endl;
    if(a<=7 && b>=7)
        cout<<7<<endl;
    if(a<=11 && b>=11)
        cout<<11<<endl;
        
	if(b>100)
	{
	    for(int i=1;i<=9;i+=2) //个位数为偶数肯定不是质数,所以只查奇数即可 
	    {
	        for(int j=0;j<=9;j++)
	        {
	            int num=i*100+j*10+i;
	            if(num<a)
	                continue;
	            
	            if(num>b)
	                return 0;
	                
	            int isZ=1;
	            for(int z=3;z*z<=num;z++) //因为是奇数,所以从3开始;约数不可能大于num的开平方。 
	            {
	                if(num%z==0)
	                {
	                    isZ=0;
	                    break;
	                }
	            }
	            if(isZ)
	                cout<<num<<endl;
	        }
	    }
	}
    
    if(b>10000)
	{
	    for(int i=1;i<=9;i+=2)
	    {
	        for(int j=0;j<=9;j++)
	        {
	        	for(int k=0;k<=9;k++)
	        	{
		            int num=i*10000+j*1000+k*100+j*10+i;
		            if(num<a)
		                continue;
		            
		            if(num>b)
		                return 0;
		                
		            int isZ=1;
		            for(int z=3;z*z<=num;z++)
		            {
		                if(num%z==0)
		                {
		                    isZ=0;
		                    break;
		                }
		            }
		            if(isZ)
		                cout<<num<<endl;
		    	}
	        }
	    }
    } 
    
    if(b>1000000)
	{
	    for(int i=1;i<=9;i+=2)
	    {
	        for(int j=0;j<=9;j++)
	        {
	        	for(int k=0;k<=9;k++)
	        	{
	        		for(int l=0;l<=9;l++)
	        		{
			            int num=i*1000000+j*100000+k*10000+l*1000+k*100+j*10+i;
			            if(num<a)
			                continue;
			            
			            if(num>b)
			                return 0;
			                
			            int isZ=1;
			            for(int z=3;z*z<=num;z++)
			            {
			                if(num%z==0)
			                {
			                    isZ=0;
			                    break;
			                }
			            }
			            if(isZ)
			                cout<<num<<endl;
		            } 
		    	}
	        }
	    }
    } 
        
    return 0;
}
posted @ 2021-04-27 21:50  CodeSpark  阅读(141)  评论(0)    收藏  举报