可截素数
3797有着奇特的性质。不仅它本身是一个素数,而且如果从左往右逐一截去数字,剩下的仍然都是素数:3797、797、97和7;同样地,如果从右往左逐一截去数字,剩下的也依然都是素数:3797、379、37和3。
只有11个素数,无论从左往右还是从右往左逐一截去数字,剩下的仍然都是素数,求这些数的和。
注意:2、3、5和7不被视为可截素数。
代码演示
#include <iostream>
#include <cmath>
using namespace std;
#define MAX_N 1000000
int prime[MAX_N + 5] = {0};
int is_prime[MAX_N + 5] = {1, 1, 0};
void init() {
for (int i = 2; i <= MAX_N; i++) {
if (!is_prime[i]) prime[++prime[0]] = i;
for (int j = 1; j <= prime[0]; j++) {
if (prime[j] * i > MAX_N) break;
is_prime[prime[j] * i] = 1;
if (i % prime[j] == 0) break;
}
}
return ;
}
int is_val(int n) {
if (is_prime[n] != 0) return 0;
int x = n, h;
while (x) {
if (is_prime[x] != 0) return 0;
x /= 10;
}
h = (int)pow(10, floor(log10(n)));
x = n;
while (x) {
if (is_prime[x] != 0) return 0;
x -= (x / h) * h;
h /= 10;
}
return 1;
}
int main() {
init();
int sum = 0;
for (int i = 2; i <= prime[i]; i++) {
if (prime[i] < 10) continue;
if (!is_val(prime[i])) continue;
sum += prime[i];
}
cout << sum << endl;
return 0;
}