求双向环形素数程序
. 双向环形素数 一个n位的整数写成环形,如果按顺时针方向,从任意一位开始,读够n位,得到的都是素数;再按逆时针方向,从任意一位开始,读够n位,得到的也都是素数(素数性“立场最坚定”),则称这个数为n位双向环形素数。
如:两位数13组成的13、31都是素数。三位数337,组成的337、373、733也都是素数。所以13、337就分别是二位、三位的双向环形素数。
求六位的双向环形素数。
程序代码:
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
const int DIGIT = 6;
bool is_annular_prime(int n);
bool is_prime(int n);
int main(void) {
for (int i = 100000; i < 1000000; ++i) {
if (is_annular_prime(i)) {
printf("%d\n", i);
}
}
return 0;
}
bool is_annular_prime(int n) {
//a 用来存储数字 n 的每一位数
int a[DIGIT];
for (int i = DIGIT - 1; i >= 0; --i) {
a[i] = n % 10;
n /= 10;
}
int tmp1, tmp2, k;
bool flag = true;
for (int j = 0; j < DIGIT; ++j) {
tmp1 = tmp2 = 0;
for (k = 0; k < DIGIT; ++k) {
//顺时针判断
tmp1 = tmp1 * 10 + a[(j + k) % DIGIT];
//逆时针判断
tmp2 = tmp2 * 10 + a[(j - k + DIGIT) % DIGIT];
}
if (!((tmp1 == tmp2 && is_prime(tmp1))
|| (is_prime(tmp1) && is_prime(tmp2)))) {
flag = false;
break;
}
}
return flag;
}
bool is_prime(int n) {
int max = sqrt(n);
bool flag = true;
for (int i = 2; i < max; ++i) {
if (n % i == 0) {
flag = false;
break;
}
}
return flag;
}

程序代码:
for (int i = DIGIT - 1; i >= 0; --i) {
a[i] = n % 10;
n /= 10;
}
程序代码:
int i;
for (i = DIGIT - 1; i >= 0; --i) {
a[i] = n % 10;
n /= 10;
}
