C语言,有点急。
构造魔方阵:
1.根据用户输入的矩阵的阶数n (n为奇数),编写程序构造nn 阶魔方阵,图35.1
是一个33魔方阵实例。
2.根据用户输入的素数范围m构造所有的3*3阶素数魔方阵,即找出9个不大于m的
素数并排构成魔方阵。
[功能要求]
1.主函数实现主菜单的显示,如图35.2所示。
魔方阵
1.奇数阶魔方阵
2.素数魔方阵
请输入选项:
图35. 2程序主菜单
2.编写一个函数根据用户输入的阶数构造奇数阶魔方阵,并输出各行、列及主、副对角
线相等的和值。当用户输入偶数时,要求再次输入,直到用户输入为奇数为止,如图35. 3
所示。.
4.编写一个函数根据用户输入的素数范围m构造所有的素数魔方阵,素数魔方阵中的各个组成元素值均为1--m之间的素数。图35. 4给出了3个由小于80的素数组成的素数魔方阵。.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void menu()
{
printf(" 魔方阵\n");
printf("****************************\n");
printf("1.奇数阶魔方阵\n");
printf("2.素数魔方阵\n");
printf("0.退出\n");
printf("****************************\n");
}
void odd()
{
int n=0;
while (n % 2 == 0)
{
printf("请输入奇数阶数:");
printf("\n");
scanf("%d", &n);
}
int **a = (int**)calloc(n, sizeof(int*));
for (int i = 0; i < n; i++)
a[i] = (int*)calloc(n, sizeof(int));
a[0][n / 2] = 1;//1放在第一行中间
int row= 0;//当前行下标
int col = n/ 2;//当前列下标
for (int i = 2; i <= n*n; i++) //一个一个数字去填 遍历下标 不是按行列了
{
//上一行后一列
row = (row - 1 + n) % n; //环形处理
col = (col + 1) % n;
//当前位置有数字有数字
if (a[row][col] != 0)
{
row = (row + 2) % n;
col = (col - 1 + n) % n;
}
a[row][col] = i;
}
int sum = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i == j)
sum += a[i][j];
printf("%d\t", a[i][j]);
}
printf("\n\n\n");
}
printf("各行、列及主、副对角线相等的和为:\t%d\n", sum);
}
int sushu(int n)
{
int i;
if (n == 1) return 1;
for (i = 2; i <= n; i++)
if (n%i == 0) break;
if (n == i) return 1;
else return 0;
}
int wunai(int t, int b, int c, int d, int e, int f, int g, int h, int p)
{
int a[9];
int i, j;
a[0] = t; a[1] = b; a[2] = c; a[3] = d; a[4] = e; a[5] = f; a[6] = g; a[7] = h; a[8] = p;
for (i = 0; i < 9; i++)
for (j = i + 1; j < 9; j++)
if (a[i] == a[j]) return 0;
for (i = 0; i < 9; i++)
if (sushu(a[i]) != 1) return 0;
return 1;
}
bool isPrime(int n)
{
if (n == 2)
return true;
if (n % 2 == 0)
return false;
for (int i = 3; i <= sqrt(n); i += 2)//跳过偶数
{
if (n%i == 0)
return false;
}
return true;
}
void prime()
{
int k;
printf("请输入组成魔方阵的素数范围(小于100):");
printf("\n");
scanf("%d", &k);
int i, i1, i2;
static int j = 0, n = 0;
int a, b, c, d, z;
int ar[500];
for (i = 1; i < k; i++)
if (sushu(i) == 1) { ar[j] = i; j++; }
for (i = 0; i < j; i++)
{
a = ar[i];
for (i1 = 0; i1 < j; i1++)
{
b = ar[i1];
for (i2 = 0; i2 < j; i2++)
{
d = ar[i2];
c = (a + 2 * b + d) / 4;
if ((a != b && b != d) && ((a + 2 * b + d) % 4 == 0) && sushu(c) == 1)
{
z = 3 * c;
if (wunai(a, b, c, d, z - a - b, z - c - d, z - b - c, z - a - c, z - b - d))
if ((z - a - b) > 0 && (z - c - d) > 0 && (z - b - c) > 0 && (z - a - c) > 0 && (z - b - d) > 0)
{
if ((z - a - b) < k && (z - c - d) < k && (z - b - c) < k && (z - a - c) < k && (z - b - d) < k)
{
printf("%d ", z - a - b);
printf("%d ", a);
printf("%d\n", b);
printf("%d ", z - c - d);
printf("%d ", c);
printf("%d\n", d);
printf("%d ", z - b - c);
printf("%d ", z - a - c);
printf("%d\n", z - b - d);
printf("\n\n");
n++;
//if (n == 8) return ;
}
}
}
}
}
}
}
void exit()
{
exit(0);
}
int main()
{
menu();
int choice;
printf("请输入选项:\n");
scanf("%d", &choice);
switch (choice)
{
case 1:
odd();
break;
case 2:
prime();
break;
case 0:
exit();
break;
default:
printf("输入无效\n");
break;
}
}
https://download.csdn.net/download/u011871226/6032639?utm_source=bbsseo
别人写的,希望对你有帮助
只有三阶素数魔方阵也可以的!