魔方数组的C 语言实现以及算法

最近复习完C语言,想做点可以锻炼自己的小项目,于是发现了一本叫《C语言程序设计实例精粹》的书,感觉很适合我,于是就
打了几个感觉比较好玩的程序吧,也是锻炼自己读代码和写代码的能力,我也会不定期的更新一些适合新手练习的程序以及算法,
程序上边有比较详细的注释和讲解,有共同爱好的可以交流一下。

这个程序为设计魔方数组的一段程序,也是设计魔方数组的一种算法,其实我感觉这本书上的这种算法不好用,比较复杂,
而且书上也有很多小错误例如 malloc的返回值是void型的 而明mtrx是整型的,不能画等号,要(int*malloc)才行。

//① 在第一行中间放1;
//② 假定当前元素的下标为(i,j),则对其余的2~n方个数,基本的放置位置为当前位置的右上方,即下标为(i-1,j+1);
//   与此同时,若当前的数是n的倍数,则放在当前位置的正下方;
//   即下标为(i+1,j);若i-1小于1,则将这个数放在本列最下端;
//   若j+1大于n,则将这个数放在本行最左端。
#include<stdio.h>
#include<malloc.h>//动态存储分配函数头文件,当对内存区进行操作时,调用相关函数.
void main()
{
	int array(int n);
	int n;

	printf("Enter the number,please:\n");
	scanf_s("%d", &n);
	array(n);

	getchar();
	getchar();
}

int array(int n)
{
	int i, j, no, num, max;
	int *mtrx;//指向存放魔方矩阵一维数组

	if (n % 2 == 1)
	{
		n = n + 1;
	}
	max = n*n;

//开始构建魔方矩阵
	mtrx = (int*)malloc(max*max);
	mtrx[max / 2] = 1;//第一个数
	i = 0;
	j = n / 2;
	for (num = 2; num <= max; num++)
	{
		i = i - 1;
		j = j + 1;
		if ((num - 1) % n == 0)//由于上边已经执行一次循环,所以要num-1,i,j位置随上次循环的变动,判断是不是特殊情况。
		{
			i = i + 2;
			j = j - 1;
		}
		if (i < 0)//i上边已经减过一次,所以不用再减
		{
			i = n - 1;
		}
		if (j > n - 1)
		{
			j = 0;
		}
		no = i*n + j;
		mtrx[no] = num;//对一位数组进行赋值
	}
	printf("The magic matrix is:");//对mtrx进行输出
	no = 0;
	for (i = 0; i < n;i++)
	{
		printf("\n");
		for (j = 0; j < n; j++)
		{
			printf("%3d", mtrx[no]);
			no++;
		}
	}
	free(mtrx);
	return *mtrx;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值