c语言的一道关于数组的编程题

输出“魔方阵”。所谓魔方阵是指这样的方阵,它的每一行,每一列和对角线之和均相等。

算法:
魔方阵的排列规律(奇数阵):
⑴将1放在第一行中间一列。
⑵从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1。
⑶如果上一个数的行数为1,则下一个数的行数为n,列数加1。如果上一个数的列数的n时,下一个数的列数为1,行数减1。
⑷如果按上面的规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。

#include <stdio.h> 
#define N 16 //N可修改 
int main() 

int a[N][N]={0},i,j,k,p,m,n; 
p=1; 
while(p==1) 

printf("Enter n(1~%d): ",N-1); 
scanf("%d",&n); 
if((n!=0)&&(n<N)&&(n%2!=0)) 
p=0; 

i=n+1; 
j=n/2+1; 
a[1][j]=1; 
for(k=2;k<=n*n;k++) 

i=i-1; 
j=j+1; 
if((i<1)&&(j>n)) 

i=i+2;j=j-1; 

else 

if(i<1) i=n; 
if(j>n) j=1; 

if(a[i][j]==0) a[i][j]=k; 
else 

i=i+2; 
j=j-1; 
a[i][j]=k; 


for(i=1;i<=n;i++) 

for(j=1;j<=n;j++) 
printf("%4d",a[i][j]); 
printf("\n"); 


return 0; 
}

追问

对于算法能在做一点解释吗

追答

参考下这里:http://wenku.baidu.com/view/460f4f63f5335a8102d22020.html
不要忘了采纳哦!!!

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-12-18
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//改程序限定魔方矩阵是奇数的
int main()
{
int N,i,j,k;
printf("PLease input the number:\n");
scanf("%d",&N);
int **a=(int **)malloc(sizeof(int *)*N);//给矩阵分配空间
for(j=0;j<N;j++)
{
a[j]= (int *)malloc(sizeof(int)*N);
}
for(i=0;i<N;i++)
{
for (j=0;j<N;j++)
{
a[i][j] = 0;
//printf("%d\t",a[i][j]);
}
printf("\n");
}
j=N/2;
a[0][j] = 1;//魔方阵的1肯定在第一行中间列上
for(k=2; k<=N*N; k++)
{
i--;
j++;
if(i<0)
{
i=N-1;
}
if(j>N-1)
{
j=0;
}
if(a[i][j]==0)
{
a[i][j]=k;
}
else
{
i=(i+2)%N;
j=(j-1+N)%N;
a[i][j]=k;
}
}
printf("\n\n");
for(i=0; i<N; i++)
{
printf("\t");
for(j=0; j<N; j++)
{
printf("%d\t",a[i][j]);
}
printf("\n\n");
}
system("pause");
return 0;
}

我的编译环境是win7+VS2010,没有问题

C语言的数组编程题,求大神解答?
for(i=0; i<k; ++i)if(c[i]==max)printf("%d ",t[i]);} return 0;}

C语言编程题:定义一个长度为10的数组,求最大值及下标。
C语言程序如下:include <stdio.h> void fun(int a[],int n,int *k){ int i,maxxr,j;maxxr=a[0];for(i=0;i<n;i++){ if(maxxr<a[i]){ maxxr=a[i];} } for(i=0;i<n;i++){ if(maxxr==a[i]){ j=i;break;} } k=j;} int main(void){ int a[10]={ 876,...

c语言数组的编程题?
include<stdio.h> define N 3 define M 2 void GetMin(int a[][N],int m,int n,int b[]) { int i,j;b[0]=b[1]=0;for ( i=0;i<m;i++ ) for ( j=0;j<n;j++ ) if ( a[i][j]<a[b[0]][b[1]] ) { b[0]=i;b[1]=j; } } void main() { int a[M...

有关数组的c语言编程题
printf("数组原来的数据: \\n");for(i=0; i<L; i++) printf("%d ", a[i]);printf("\\n");printf("从a[n]开始向前移位,其中n=");scanf("%d", &n);doit(a, n-1);} 第二题: doit()函数即可完成将数组a中所有质数放入数组b中的任务,最后返回值为b中质数的个数 include <s...

C语言编码题:输入一个整型数组,数组元素有正数有负数。数组中连续的一...
\/\/ 数组,长度 { int maxSum=a[0];int p0=0, p1=0;int i,j,sum;for (i=0; i<n; i++){ sum=0;for (j=i; j<n; j++){ sum+=a[j];if (sum>maxSum){ maxSum=sum;p0=i;p1=j;} } } while (p0<p1) printf("%d," a[p0++]);printf("%d\\n" a[p1]);} ...

C语言数组题
如果该数不在数组中,则打印”No found”。5、编程打印如下图形:6、有一电文,已按下列规律译成译码:A→Z a→z B→Y b→y C→X c→x … …即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母。非字母字符不变。编写一个程序将密码译成原文,并输出密码和原文。

C语言程序题 现有一个小数数组{12.9,53.54,75.0,99.1,3.14}。请编写代 ...
下面是一个使用C语言编写的代码,用于计算给定数组中所有元素的平均值:include <stdio.h> int main(){ double numbers[] = {12.9, 53.54, 75.0, 99.1, 3.14};int length = sizeof(numbers) \/ sizeof(double); \/\/ 数组的长度 double sum = 0.0; \/\/ 所有数的和 \/\/ 计算所有数的...

C语言题目,求大神解答
\/\/返回执行删除操作后p1数组中保存的元素数量 return m;} int main(void){ PS p1[10] = { {1, "a", "m"}, {2, "b", "f"}, {3, "c", "m"}, {4, "d", "f"}, {5, "e", "m"} };PS p2[5] = { {1, "a", "m"}, {3, "c", "m"}, {5, "e", "...

(用C语言)编程计算数组各元素的平方和,要求如下
int square_sum(int array[],int n){ int i=0,sum=0;for(i=0;i<n;i++)sum+=array[i]*array[i];return(sum);\/\/要返回平方和的值,返回到主函数,,所以此函数是 int 型,int 型才有返回值,void的没有 } 但我建议你自己写写,写了哪有问题再问,这样对你会比较好。希望对你有...

C语言编程:已知一个长度为10的一维数组arr,编写函数,求出第m个数到第...
define N 10 int getTotal(int *p,int m,int n){ int i=0,total=0;for(i=m;i<=n;i++)total += *(p+i);return total;} void main(){ int arr[10]={NULL};int i,num,m,n;printf("请输入十个数:\\n");for(i=0;i<10;i++)scanf("%d",(arr+i));printf("请输入m:...

相似回答