USACO1.5 Prime Palindromes(pprime)

        題目中提示的很清楚,先求出迴文數,而後檢測該數是否是質數。具體實現以下:先求出a,b的位數wa,wb,再求出位數在[wa,wb]之間的全部迴文質數存入set中並進行自動排序,其中可能有一些不在範圍[a,b]中的數,只需打印出在[a,b]範圍內的便可。ios

 

/*
ID:jzzlee1
PROG:pprime
LANG:C++
*/
#include<iostream>
#include<fstream>
#include<cstring>
#include<set>
#include<cmath>
using namespace std;
ifstream fin("pprime.in");
ofstream fout("pprime.out");
bool check(int p)		//檢測是否質數
{
	for(int i=2;i<=(int)sqrtf(p);i++)
		if(p%i==0)
			return 0;
	return 1;
}
int main()
{
	int a,b;
	//cin>>a>>b;
	fin>>a>>b;
	int wa=0,wb=0;
	int x=a,y=b;
	while(x)            //求a的位數wa
	{
		x/=10;
		wa++;
	}
	while(y)            //求b的位數wb
	{
		y/=10;
		wb++;
	}
	set<int> set1;
	int pal;int d1,d2,d3,d4;
	if(wa<3&&wb>0)					// 一位數、兩位數
	{
		for(d1=1;d1<=9;d1+=2) 	
		{
			if(wa<2)				//一位數
			{
				pal=d1;
				if(check(pal))
					set1.insert(pal);
			}
			if(wb>1)				//兩位數
			{
				pal=11*d1;
				if(check(pal))
					set1.insert(pal);
			}
		}
	}
	if(wa<5&&wb>2)					//三位數、四位數
	{
		for (d1 = 1; d1 <= 9; d1+=2) 
			for (d2 = 0; d2 <= 9; d2++) 
			{
				if(wa<4)			//三位數
				pal=101*d1+10*d2;
				if(check(pal))
					set1.insert(pal);
				if(wb>3)			//四位數
				{
					pal=1001*d1+110*d2;
					if(check(pal))
						set1.insert(pal);
				}
			}
	}
	if(wa<7&&wb>4)					//五位數、六位數
	{
		for (d1 = 1; d1 <= 9; d1+=2) 
			for (d2 = 0; d2 <= 9; d2++) 
				for (d3 = 0; d3 <= 9; d3++) 
				{
					if(wa<6)		//五位數
					{
						pal=10001*d1+1010*d2+100*d3;
						if(check(pal))
							set1.insert(pal);
					}
					if(wb>5)		//六位數
					{
						pal=100001*d1+10010*d2+1100*d3;
						if(check(pal))
							set1.insert(pal);
					}
			}
		}
	if(wa<=9&&wb>6)					//七位數、八位數
	{
		for (d1 = 1; d1 <= 9; d1+=2) 
			for (d2 = 0; d2 <= 9; d2++) 
				for (d3=0;d3<=9;d3++) 
					for(d4=0;d4<=9;d4++)
					{
						if(wa<8)	//七位數
						{
							pal=1000001*d1+100010*d2+10100*d3+1000*d4;
							if(check(pal))
								set1.insert(pal);
						}
						if(wb>7)	//八位數
						{
							pal=10000001*d1+1000010*d2+100100*d3*11000*d4;
							if(check(pal))
								set1.insert(pal);
						}
				}
	}
	set<int>::iterator iter;
	for(iter=set1.begin();iter!=set1.end();iter++)//打印在[a,b]範圍內的數
		if(*iter>=a&&*iter<=b)
			//cout<<*iter<<endl;
			fout<<*iter<<endl;
	return 0;
}
相關文章
相關標籤/搜索