求双向环形素数程序
. 双向环形素数 一个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; }