題目中提示的很清楚,先求出迴文數,而後檢測該數是否是質數。具體實現以下:先求出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; }