【问题描述】待更...
【原理】
【版本1代码】
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <string.h>
#define maxSize 100
void Magic(int n)
{
if (n < 1 || n % 2 == 0)
{
printf("Fatal Error:Wrong Number");
return;
}
int** A = (int**)malloc(n * sizeof(int*));
int i, j, n2, k;
n2 = n * n;
for (i = 0; i < n; ++i)
{
A[i] = (int*)malloc(n * sizeof(int));
}
i = 0, j = n / 2, A[i][j] = 1;
/*k-1表示当前数*/
for (k = 2; k <= n2; ++k)
{
if ((k-1)%n == 0)
{
i = i + 1;
A[i][j] = k;
}
else if (i == 0)
{
i = n - 1, j = j + 1;
A[i][j] = k;
}
else if (j == n - 1)
{
i = i - 1, j = 0;
A[i][j] = k;
}
else
{
i = i - 1, j = j + 1;
A[i][j] = k;
}
}
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
printf("%3d ", A[i][j]);
}
printf("\n");
}
for (i = 0; i < n; ++i)
{
free(A[i]);
}
free(A);
}
int main()
{
Magic(5);
return 0;
}
【版本2代码】
#include <stdio.h>
#include <stdlib.h>
void Magic(int n)
{
if (n < 1 || n % 2 == 0)
{
printf("Fatal Error:Wrong Number");
return;
}
int** A = (int**)malloc(n * sizeof(int*));
int i, j, n2, k;
n2 = n * n;
for (i = 0; i < n; ++i)
{
A[i] = (int*)malloc(n * sizeof(int));
}
i = 0, j = n / 2, A[i][j] = 1;
/*k表示当前数*/
for (k = 1; k < n2; ++k)
{
if (k%n == 0)
{
A[i + 1][j] = k + 1;
i = i + 1;
}
else if (i == 0)
{
A[n - 1][j + 1] = k + 1;
i = n - 1, j = j + 1;
}
else if (j == n - 1)
{
A[i - 1][0] = k + 1;
i = i - 1, j = 0;
}
else
{
A[i - 1][j + 1] = k + 1;
i = i - 1, j = j + 1;
}
}
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
printf("%3d ", A[i][j]);
}
printf("\n");
}
for (i = 0; i < n; ++i)
{
free(A[i]);
}
free(A);
}
int main()
{
Magic(5);
return 0;
}
【测试结果】
【版本3】
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <ctype.h>
#define maxSize 100
void Matrix(int a[][maxSize], int n)
{
int n2 = n * n;
int i, j, k;
k = 1;
i = 0;
j = n / 2;
a[i][j] = k;
for (k = 2; k <= n2; ++k)
{
if ((k - 1) % n == 0)
{
i = i + 1;
}
else
{
if (i == 0)
i = n - 1;
else
i--;
if (j == n - 1)
j = 0;
else
j++;
}
a[i][j] = k;
}
}
int main()
{
int a[maxSize][maxSize];
int i, j, n;
n = 5;
Matrix(a, n);
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}