2017-8-3
题目描述
求出给定范围内的质数回文数
解答
先求出回文数再判断是否为给定区间的质数
代码
/*
ID: 18795871
PROG: pprime
LANG: C++
*/
#include
#include
#include
using namespace std;
ifstream fin("pprime.in");
ofstream fout("pprime.out");
const int N = 1000;
long x[N+1];
int cnt=0;
long a,b;
bool is_prime(long n){ //判断是否为给定区间的质数
if (nb){
return false;
}
if (n==0||n==1) return false;
if (n==2||n==3) return true;
long i;
for (i=2;i<=sqrt(n);i++){
if (n%i==0) return false;
}
return true;
}
void hui_8(){ //八位回文数
int x1,x2,x3,x4;
for (x1=1;x1<=9;x1+=2){
for (x2=0;x2<=9;x2++){
for (x3=0;x3<=9;x3++){
for (x4=0;x4<=9;x4++){
long n=(x1*1000+x2*100+x3*10+x4)*10000+x4*1000+x3*100+x2*10+x1;
if (is_prime(n)) fout<void hui_7(){
int x1,x2,x3,x4;
for (x1=1;x1<=9;x1+=2){
for (x2=0;x2<=9;x2++){
for (x3=0;x3<=9;x3++){
for (x4=0;x4<=9;x4++){
long n=(x1*1000+x2*100+x3*10+x4)*1000+x3*100+x2*10+x1;
if (is_prime(n)) fout<void hui_6(){
int x1,x2,x3;
for (x1=1;x1<=9;x1+=2){
for (x2=0;x2<=9;x2++){
for (x3=0;x3<=9;x3++){
long n=(x1*100+x2*10+x3)*1000+x3*100+x2*10+x1;
if (is_prime(n)) fout<void hui_5(){
int x1,x2,x3;
for (x1=1;x1<=9;x1+=2){
for (x2=0;x2<=9;x2++){
for (x3=0;x3<=9;x3++){
long n=(x1*100+x2*10+x3)*100+x2*10+x1;
if (is_prime(n)) fout<void hui_4(){
int x1,x2;
for (x1=1;x1<=9;x1+=2){
for (x2=0;x2<=9;x2++){
long n=(x1*10+x2)*100+x2*10+x1;
if (is_prime(n)) fout<void hui_3(){
int x1,x2;
for (x1=1;x1<=9;x1+=2){
for (x2=0;x2<=9;x2++){
long n=(x1*10+x2)*10+x1;
if (is_prime(n)) fout<void hui_2(){
int x1;
for (x1=1;x1<=9;x1+=2){
long n=x1*10+x1;
if (is_prime(n)) fout<void hui_1(){
for (int i=2;i<=9;i++){
if (is_prime(i)) fout<int main(){
cnt=0;
fin>>a>>b;
hui_1();
hui_2();
hui_3();
hui_4();
hui_5();
hui_6();
hui_7();
hui_8();
return 0;
}
1.回文数比较少,那么我们可以先判断回文数再判断素数
2.我们可以枚举区间内所有的数,如果是回文数的话就再判断是否为素数,但是这个在第七个测试数据的时候就已经超时了。
3.那么我们最后的选择就是自己构建回文数。
/*
ID: 18795871
PROG: pprime
LANG: C++
*/
#include
#include
#include
using namespace std;
ifstream fin("pprime.in");
ofstream fout("pprime.out");
typedef long long ll;
ll a,b;
bool ispal(ll n){
int x[10],cnt=0;
while (n){
x[cnt++]=n%10;
n/=10;
}
if (cnt==1) return true;
for (int i=0;i2;i++){
if (x[i]!=x[cnt-i-1]) return false;
}
return true;
}
int main(){
while (fin>>a>>b){
ll i,j;
for (i=a;i<=b;i++){
if (ispal(i)){
for (j=2;j*j<=i;j++){
if (i%j==0) break;
}
if (j*j>i) fout<return 0;
}
上面的是超时的代码。。。
它给的提示是枚举所有的回文数(不是暴力枚举,而是自己构建),然后再判断即可,这里需要注意的是:我们可以在is_prime函数里面判断是否在给定a到b区间内,这样可以省去很多判断。
/*
ID: 18795871
PROG: pprime
LANG: C++
*/
#include
#include
#include
using namespace std;
ifstream fin("pprime.in");
ofstream fout("pprime.out");
typedef long long ll;
const int N = 10;
ll a,b;
int i,j,k,t;
bool isprime(ll n){
if (n>b||nreturn false;
for (int i=2;i*i<=n;i++){
if (n%i==0) return false;
}
return true;
}
void pal1(){
for (i=1;iif (isprime(i)){
fout<for (i=1;iif (isprime(i*10+i)){
fout<<(i*10+i)<for (i=1;ifor (j=0;jif (isprime(i*100+j*10+i)){
fout<<(i*100+j*10+i)<for (i=1;ifor (j=0;jif (isprime((i*10+j)*100+j*10+i)){
fout<<((i*10+j)*100+j*10+i)<for (i=1;ifor (j=0;jfor (k=0;kif (isprime((i*100+j*10+k)*100+j*10+i)){
fout<<((i*100+j*10+k)*100+j*10+i)<for (i=1;ifor (j=0;jfor (k=0;kif (isprime((i*100+j*10+k)*1000+k*100+j*10+i)){
fout<<((i*100+j*10+k)*1000+k*100+j*10+i)<for (i=1;ifor (j=0;jfor (k=0;kfor (t=0;tif (isprime((i*1000+j*100+k*10+t)*1000+k*100+j*10+i)){
fout<<((i*1000+j*100+k*10+t)*1000+k*100+j*10+i)<for (i=1;ifor (j=0;jfor (k=0;kfor (t=0;tif (isprime((i*1000+j*100+k*10+t)*10000+t*1000+k*100+j*10+i)){
fout<<((i*1000+j*100+k*10+t)*10000+t*1000+k*100+j*10+i)<int main(){
while (fin>>a>>b){
pal1();
pal2();
pal3();
pal4();
pal5();
pal6();
pal7();
pal8();
}
return 0;
}