生成回文数并判断是否是素数
和analysis里面的几种生成方式都不同
是递归,但是感觉比analysis里面的那种递归low了很多,毕竟写得十分浅显...。
长度是奇数时,就把中间的那个数扩展成两个数
长度是偶数时,就用0-9尝试最中间的数
开始时控制最低位为1,3,5,7
结束时判断长度和大小关系
就是这样浅显...。
代码如下:
/*
ID: fan_0111
PROG: pprime
LANG: C++
*/
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#define maxn 1000
using namespace std;
int lenb = 0, tot = 0, c[11], ans[maxn], a, b;
void generate(int* c,int p,int x);
bool isprime(int x);
int main() {
freopen("pprime.in","r",stdin);
freopen("pprime.out","w",stdout);
cin >> a >> b;
int bb = b;
while (bb > 0) {
bb /= 10;
++lenb;
}
if (a == 5) {
ans[tot++] = 5;
}
c[0] = 1;
generate(c,1,1);
c[0] = 1;
generate(c,1,3);
c[0] = 1;
generate(c,1,7);
c[0] = 1;
generate(c,1,9);
sort(ans,ans+tot);
for (int i=0;i<tot;++i) {
cout << ans[i] << endl;
}
fclose(stdin);
fclose(stdout);
return 0;
}
void generate(int* c,int p,int x) {
c[p] = x;
int sum = 0;
for (int i=1;i<=c[0];++i) {
sum = sum*10 + c[i];
}
// cout << sum << endl;
if (sum >= a && sum <= b && isprime(sum)) {
ans[tot++] = sum;
}
int len = c[0];
if (len == lenb) {
return;
}
int j,k;
++c[0];
if (len % 2 == 0) {
for (j=len+1;j>len/2+1;--j) {
c[j] = c[j-1];
}
for (j=0;j<=9;++j) {
generate(c,len/2+1,j);
}
for (j=len/2+1;j<=len;++j) {
c[j] = c[j+1];
}
}
else {
for (j=len+1;j>len/2+2;--j) {
c[j] = c[j-1];
}
generate(c,len/2+2,c[len/2+1]);
for (j=len/2+2;j<=len;++j) {
c[j] = c[j+1];
}
}
--c[0];
}
bool isprime(int x) {
for (int i=2;i<=floor(sqrt(x)+0.5);++i) {
if (x%i == 0) {
return false;
}
}
return true;
}