请用c语言写一个程序,实现:通常的n阶幻方由1,2,3,4,...,n^2填入构成。而素数幻方全是由素数构成的各行、各列与两对角线之和均相等的方阵。 试在一般区间[c,d]找出9个素数,构成一个三阶素数幻方,使得该方阵中3行、3列与两对角线上的3个数之和均相等。最后统计出素数幻方的个数。注意,一个素数幻方转置后仍就是素数幻方,但不再计入总数。 例如,c=100,d=400,那么区间[100,400]内的素数幻方共有2个,分别是: No.1: 137 353 191 281 227 173 263 101 317 No.2: 173 359 257 347 263 179 269 167 353 输入 输入正整数c和d(c<d,且d<=2000)。 输出 输出区间[c,d]内的素数幻方个数。
时间: 2024-01-17 21:06:11 浏览: 70
生成n阶幻方的程序
下面是用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#define MAX_N 15
int n;
int magic[MAX_N][MAX_N];
bool is_prime[2001];
bool is_magic() {
int sum = 0;
for (int i = 0; i < n; i++) {
sum += magic[i][i] + magic[i][n - i - 1];
}
for (int i = 0; i < n; i++) {
int row_sum = 0, col_sum = 0;
for (int j = 0; j < n; j++) {
row_sum += magic[i][j];
col_sum += magic[j][i];
}
if (row_sum != sum || col_sum != sum) {
return false;
}
}
return true;
}
bool is_prime_number(int x) {
if (x <= 1) {
return false;
}
for (int i = 2; i <= sqrt(x); i++) {
if (x % i == 0) {
return false;
}
}
return true;
}
int dfs(int cur) {
if (cur == n * n) {
return is_magic() ? 1 : 0;
}
int x = cur / n, y = cur % n;
int cnt = 0;
for (int i = 2; i <= 2000; i++) {
if (is_prime[i]) {
bool flag = true;
for (int j = 0; j < x; j++) {
if (magic[j][y] == i) {
flag = false;
break;
}
}
for (int j = 0; j < y; j++) {
if (magic[x][j] == i) {
flag = false;
break;
}
}
if (flag) {
magic[x][y] = i;
cnt += dfs(cur + 1);
magic[x][y] = 0;
}
}
}
return cnt;
}
int main() {
int c, d;
scanf("%d%d", &c, &d);
for (int i = 2; i <= 2000; i++) {
is_prime[i] = is_prime_number(i);
}
for (n = 3; n <= 9; n += 2) {
int cnt = dfs(0);
printf("n=%d, cnt=%d\n", n, cnt);
}
return 0;
}
```
首先定义了一个is_prime数组,用于记录2到2000之间的所有素数。然后定义了一个is_prime_number函数,用于判断一个数是否为素数。接着定义了一个is_magic函数,用于判断一个方阵是否为素数幻方。is_magic函数中先计算出两条对角线的和sum,然后分别计算出每行、每列的和,如果它们都等于sum,则说明这个方阵是素数幻方,返回true,否则返回false。
接着定义了一个dfs函数,用于搜索符合条件的素数幻方。dfs函数中使用了回溯法,从左到右、从上到下依次填入数字。对于每个位置,枚举2到2000之间的素数,判断这个素数是否已经出现在当前行或当前列中,如果没有出现,则将这个素数填入当前位置,并继续搜索下一个位置。如果搜索到了最后一个位置,就判断这个方阵是否为素数幻方,如果是,则返回1,否则返回0。最后,在主函数中调用dfs函数,分别搜索3阶、5阶、7阶、9阶的素数幻方,并统计个数。
需要注意的是,对于每个测试用例,都需要重新搜索素数幻方,因为不同的测试用例区间[c,d]不同。
阅读全文