前言:
这两天有点急功近利了,压力有些过大了。人一紧张思维就会僵硬,都不会思考了,看到有hint,没经过什么精神斗争就点进去看了。压力下人真的很难取得成绩,看看下面这坨代码,我都干了什么!
题目大意:
给出两个整数a,b,输出[a,b]范围内的所有回文质数。
思路:
刚开始尝试用筛选法打素数表,但是空间不够。然后看了hint的提示,改成先生成回文数再判断是否为质数。生成回文数的方法是多重循环,方法同样来自hint循环。
代码:
/* ID: lujunda1 LANG: C++ PROG: pprime */ #include<iostream> #include<stdio.h> #include<cmath> using namespace std; bool check_prime(int n) //判断n是否为质数。 { for(int i=2;i<=sqrt(double(n));i++) if(n%i==0) return false; return true; } void get_pali(int n,int m) //输出[n,m]范围内的所有回文质数。 { for(int a=5;a<10;a+=2) //寻找1位回文质数。 if(check_prime(a)&&n<=a&&a<=m) printf("%d\n",a); for(int a=1;a<10;a+=2) //寻找2位回文质数。 { int temp=a*10+a; if(check_prime(temp)&&n<=temp&&temp<=m) //判断回文数是否为质数与是否在规定范围内。 printf("%d\n",temp); } for(int a=1;a<10;a+=2) for(int b=0;b<10;b++) //寻找3位回文质数。 { int temp=a*100+b*10+a; if(check_prime(temp)&&n<=temp&&temp<=m) printf("%d\n",temp); } for(int a=1;a<10;a+=2) for(int b=0;b<10;b++) //寻找4位回文质数。 { int temp=a*1000+b*100+b*10+a; if(check_prime(temp)&&n<=temp&&temp<=m) printf("%d\n",temp); } for(int a=1;a<10;a+=2) for(int b=0;b<10;b++) for(int c=0;c<10;c++) //寻找5位回文质数。 { int temp=a*10000+b*1000+c*100+b*10+a; if(check_prime(temp)&&n<=temp&&temp<=m) printf("%d\n",temp); } for(int a=1;a<10;a+=2) for(int b=0;b<10;b++) for(int c=0;c<10;c++) //寻找6位回文质数。 { int temp=a*100000+b*10000+c*1000+c*100+b*10+a; if(check_prime(temp)&&n<=temp&&temp<=m) printf("%d\n",temp); } for(int a=1;a<10;a+=2) for(int b=0;b<10;b++) for(int c=0;c<10;c++) for(int d=0;d<10;d++) //寻找7位回文质数。 { int temp=a*1000000+b*100000+c*10000+d*1000+c*100+b*10+a; if(check_prime(temp)&&n<=temp&&temp<=m) printf("%d\n",temp); } for(int a=1;a<10;a+=2) for(int b=0;b<10;b++) for(int c=0;c<10;c++) for(int d=0;d<10;d++) //寻找8位回文质数。 { int temp=a*10000000+b*1000000+c*100000+d*10000+d*1000+c*100+b*10+a; if(check_prime(temp)&&n<=temp&&temp<=m) printf("%d\n",temp); } } int main() { freopen("pprime.in","r",stdin); freopen("pprime.out","w",stdout); int a,b; scanf("%d%d",&a,&b); get_pali(a,b); }