输出魔方阵,所谓魔方阵是指这样的方阵,它的每一行,每一列和对角线之和均相等。例如,三阶魔方阵为

输出魔方阵,所谓魔方阵是指这样的方阵,它的每一行,每一列和对角线之和均相等。例如,三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求输出1~n2的自然数构成的魔方阵。

#include<stdio.h>

int main()
{ 
	int a[16][16],i=0,j=0,k=0,p=0,n=0;
	
  	p=1;
  	
  	while(p==1)
    {
		printf("enter n(n=1--15):");
     	scanf("%d",&n);
     	if ((n>=0) && (n<=15) && (n%2!=0))
       		p=0;
    }
    
  	for(i=1;i<=n;i++)   //初始化操作 
  	{
  		for(j=1;j<=n;j++)
    		a[i][j]=0;
	}
	
    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;
       }
    }
    
    
    printf("各行行的和为:\n");
  	for (i=1;i<=n;i++)
  	{	
  		int sum=0;
		for (j=1;j<=n;j++)
		{
			printf("%5d",a[i][j]);
			sum+=a[i][j];
		}	
    	printf("\t\t%d\n",sum);
    }
    printf("\n\n");
    
    
    printf("各列列的和为:\n");
    for(i=1;i<=n;i++)
    {
    	int sum=0;
    	for (j=1;j<=n;j++)
		{	
			sum+=a[j][i];
		}
		printf("%5d",sum);
	}
	printf("\n\n");
	
	
	printf("正对角线之和为:\n");
	int sum=0;
	for(i=1;i<=n;i++)
    {
    	for (j=1;j<=n;j++)
		{	
			if(i==j)
				sum+=a[i][j];
		}
	}
	printf("%5d",sum);
	printf("\n\n");
	
	printf("反对角线为之和:\n");
	sum=0;
	for(i=1;i<=n;i++)
    {
    	for (j=1;j<=n;j++)
		{	
			if(i==n-j+1)
				sum+=a[i][j];
		}
	}
	printf("%5d",sum);
    
  return 0;
}

在VS2019下,需将源文件的scanf改为scanf_s:

#include<stdio.h>

int main()
{
    int a[16][16], i = 0, j = 0, k = 0, p = 0, n = 0;

    p = 1;

    while (p == 1)
    {
        printf("enter n(n=1--15):");
        scanf_s("%d", &n);
        if ((n >= 0) && (n <= 15) && (n % 2 != 0))
            p = 0;
    }

    for (i = 1; i <= n; i++)   //初始化操作 
    {
        for (j = 1; j <= n; j++)
            a[i][j] = 0;
    }

    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;
        }
    }


    printf("各行行的和为:\n");
    for (i = 1; i <= n; i++)
    {
        int sum = 0;
        for (j = 1; j <= n; j++)
        {
            printf("%5d", a[i][j]);
            sum += a[i][j];
        }
        printf("\t\t%d\n", sum);
    }
    printf("\n\n");


    printf("各列列的和为:\n");
    for (i = 1; i <= n; i++)
    {
        int sum = 0;
        for (j = 1; j <= n; j++)
        {
            sum += a[j][i];
        }
        printf("%5d", sum);
    }
    printf("\n\n");


    printf("正对角线之和为:\n");
    int sum = 0;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= n; j++)
        {
            if (i == j)
                sum += a[i][j];
        }
    }
    printf("%5d", sum);
    printf("\n\n");

    printf("反对角线为之和:\n");
    sum = 0;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= n; j++)
        {
            if (i == n - j + 1)
                sum += a[i][j];
        }
    }
    printf("%5d", sum);

    return 0;
}
  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值