c语言奇数魔方阵

合集下载

《C语言程序》课程设计报告书-魔方阵程序设计

《C语言程序》课程设计报告书-魔方阵程序设计

吉林工程技术师范学院《C语言程序》课程设计报告书设计题目:魔方阵程序设计专业:计算机科学与技术班级:1054学生姓名:学号:21指导教师:xx2011年1月信息工程学院摘要我的实验题目是对C语言程序设计——魔方阵的编写,主要的功能是实现每一行,每一列以及对角线的相加结果相同,而且每一个数字均不相等。

本次实验能够充分的考核我们对C语言的学习程度以及动手操作能力,对我们提高C语言的能力有极大的帮助,所以这次实验也是十分有必要的。

我的设计内容就是利用循环语句,以及判断条件等函数的合理使用,通过不断的运行,调试,输出,对本程序进行合理的解决,对魔方阵进一步的了解掌握。

关键字:C语言魔方阵程序设计目录摘要................................................. 第1章概述 (1)第2章系统分析 (2)2.1 技术分析 (2)2.2 功能分析 (2)第3章总体设计与详细设计 (3)3.1 系统总体设计 (3)3.2 详细设计 (4)第4章编码实现 (6)4.1 数据输入部分代码设计 (6)4.2 运算部分代码设计 (6)4.3 输出部分代码设计 (7)第5章系统调试 (9)5.1 程序运行结果 (9)5.2 调试过程中的问题与对策 (10)第6章设计总结 (10)参考资料 (12)致谢 (12)附录:1 源代码 (13)2 附图 (14)第1章概述本次实验报告十分有意义,对巩固C语言的学习有很大的帮助。

作用:我的实验课题是魔方阵(魔方阵是一个奇数行列式方阵),主要是实现一行,一列,对角线的和都相等。

意义、帮助:1、能够熟练掌握if、if…else、if…else if语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句实现分支选择结构。

2、能够熟练掌握while语句和for语句格式及使用方法,掌握循环控制语句的循环过程以及循环结构的嵌套,利用循环语句实现循环结构。

魔方阵C语言设计方法及设计理念

魔方阵C语言设计方法及设计理念

與奇數魔術方陣相同,在於求各行、各列與各對角線的和相等,而這次方陣的維度是4的倍數。

先來看看4X4方陣的解法:簡單的說,就是一個從左上由1依序開始填,但遇對角線不填,另一個由左上由16開始填,但只填在對角線,再將兩個合起來就是解答了;如果N大於2,則以4X4為單位畫對角線:至於對角線的位置該如何判斷,有兩個公式,有興趣的可以畫圖印證看看,如下所示:if(i%4==j%4||(i%4+j%4==3)//zaiduijiaoxianshangC方陣的維度整體來看是偶數,但是其實是一個奇數乘以一個偶數,例如6X6,其中6=2X3,我們也稱這種方陣與單偶數方陣。

如果您會解奇數魔術方陣,要解這種方陣也就不難理解,首先我們令n=2(2m+1),並將整個方陣看作是數個奇數方陣的組合,如下所示:首先依序將A、B、C、D四個位置,依奇數方陣的規則填入數字,填完之後,方陣中各行的和就相同了,但列與對角線則否,此時必須在A-D與C- B之間,作一些對應的調換,規則如下:1.將A中每一列(中間列除外)的頭m個元素,與D中對應位置的元素調換。

2.將A的中央列、中央那一格向左取m格,並與D中對應位置對調3.將C中每一列的倒數m-1個元素,與B中對應的元素對調舉個實例來說,如何填6X6方陣,我們首先將之分解為奇數方陣,並填入數字,如下所示:接下來進行互換的動作,互換的元素以不同顏色標示,如下:由於m-1的數為0,所以在這個例子中,C-B部份並不用進行對調。

C將1到n(為奇數)的數字排列在nxn的方陣上,且各行、各列與各對角線的和必須相同,如下所示:填魔術方陣的方法以奇數最為簡單,第一個數字放在第一行第一列的正中央,然後向右(左)上填,如果右(左)上已有數字,則向下填,如下圖所示:一般程式語言的陣列索引多由0開始,為了計算方便,我們利用索引1到n的部份,而在計算是向右(左)上或向下時,我們可以將索引值除以n值,如果得到餘數為1就向下,否則就往右(左)上,原理很簡單,看看是不是已經在同一列上繞一圈就對了。

魔方阵

魔方阵

C语言程序求魔方阵如下:(求奇数幻方)代码一:#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);/*可以输入小于等于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");}代码二:(相对于代码一条理更清晰,更简单、更容易理解)将1~n的平方这几个数构成一个n阶魔方阵。

算法:依以下法则,你可以很快的写出奇数阶幻方!当然,这种写法只是其中一个答案,而不是唯一答案。

1)将1填入第一行中间;2)将每个数填在前一个数的右上方。

3)若该位置超出最上行,则改填在最下行的对应位置;4)若该位置超出最右列,则该填在最左列的对应行位置;5)若某元素填在第一行最右列,下一个数填在该数同列的下一行;6)若某数已填好,但其右上角已填了其他数据,则下一个数填在该数同列的下一行位置。

c语言魔方阵课程设计

c语言魔方阵课程设计

c语言魔方阵课程设计一、课程目标知识目标:1. 理解魔方阵的概念,掌握其基本性质和特点;2. 学会使用C语言实现魔方阵的生成、显示和验证;3. 掌握魔方阵相关算法,如:奇数阶魔方阵的生成方法、行列、对角线求和等;4. 了解魔方阵在实际应用中的价值,如:数学游戏、密码学等。

技能目标:1. 能够运用C语言编写程序,生成指定阶数的魔方阵;2. 能够分析魔方阵算法的时间复杂度和空间复杂度;3. 能够运用所学知识解决魔方阵相关实际问题,提高编程能力;4. 能够通过魔方阵编程实践,培养解决问题的策略和逻辑思维能力。

情感态度价值观目标:1. 培养学生对C语言编程的兴趣,激发学习热情;2. 培养学生合作探究、积极参与的精神,增强团队协作能力;3. 培养学生勇于克服困难、面对挑战的信心,提高自主学习能力;4. 引导学生认识到编程在生活中的应用价值,激发学生创新意识和实践能力。

课程性质:本课程为C语言编程实践课程,旨在让学生通过魔方阵编程实践,巩固C语言知识,提高编程能力。

学生特点:学生具备一定的C语言基础,对编程有兴趣,但可能缺乏实际编程经验。

教学要求:注重理论与实践相结合,强调动手实践,培养学生编程思维和解决问题的能力。

通过本课程的学习,使学生能够将所学知识运用到实际编程中,提高编程水平。

二、教学内容1. 魔方阵基本概念与性质- 魔方阵的定义与特点- 魔方阵的数学性质:行列、对角线求和等2. C语言编程基础回顾- 数据类型与变量- 控制结构:顺序、选择、循环- 数组的使用3. 魔方阵生成算法- 奇数阶魔方阵生成方法- 魔方阵生成程序的编写与调试4. 魔方阵显示与验证- 魔方阵的格式化输出- 验证魔方阵的正确性:行列、对角线求和检验5. 魔方阵编程实践- 编写生成指定阶数魔方阵的程序- 分析算法的时间复杂度和空间复杂度- 解决魔方阵相关实际问题6. 教学案例分析与讨论- 分析实际编程案例,总结编程技巧- 讨论编程中遇到的问题及解决方法7. 创新思维与实践- 探讨魔方阵在其他领域的应用- 鼓励学生进行创新编程实践,提高编程能力教学内容安排与进度:1. 基本概念与性质(1课时)2. C语言编程基础回顾(1课时)3. 魔方阵生成算法(2课时)4. 魔方阵显示与验证(1课时)5. 魔方阵编程实践(2课时)6. 教学案例分析与讨论(1课时)7. 创新思维与实践(1课时)教材章节关联:本教学内容与教材中关于数组、循环控制结构、函数等章节相关,通过魔方阵编程实践,使学生将所学理论知识应用于实际问题中,提高编程能力。

奇数阶魔方阵算法分析

奇数阶魔方阵算法分析

奇数阶魔方阵一、提出问题所谓“奇数阶魔方阵”是指n 为不小于3的奇数的魔方阵。

这类魔方阵的形式多样,这里我们仅讨论其中的一种形式的正规魔方阵。

例如:3阶、5阶和7阶的魔方阵如图3 – 4 所示。

294753618 ,92251811321191210222013641614752315812417 ,20112494031221234341322321444423324151345363425161453735261786462927189747382819101183930 图3 – 4 3阶5阶和7阶魔方阵容易知道,这三个魔方阵的魔方常数分别是15、65和175。

现在要求给出:能让计算机自动输出类似图3 – 4 所示的n 阶奇数魔方阵的算法,其中n 为任意给定的一个不小于3的奇数。

二、简单分析决定“奇数阶魔方阵”的关键是要按要求决定其方阵中的各个数字。

观察图3 – 4中的三个奇数阶魔方阵,不难发现:1.由于是正规魔方,故所填入的n 2个不同整数依次为1、2、3、…、n 2 ;2.各行、列和对角线上的数字虽各不相同,但其和却是相同的。

这表明,其魔方常数可由公式n ( n 2 + 1 ) / 2得到。

3.数字在阵列中的次序,并没有遵从阵列单元的行、列下标的顺序,但数字“1”却始终出现在阵列第一行的正中间位置,而数字“n 2”也始终出现在阵列第n 行的正中间位置,这说明阵列中的数字排列应该是有一定规律的。

通过对两个奇数阶魔方阵的简单分析,下面几个基本问题必须得到解决:◆ 奇数阶魔方阵中的数字有些什么规律?◆ 数字“1”的位置应如何确定?三、设计准备1.奇数阶魔方阵中的数字规律通过对奇数阶魔方阵的分析,其中的数字排列有如下的规律:(1)自然数1出现在第一行的正中间;(2)若填入的数字在第一行(不在第n 列),则下一个数字在第n 行(最后一行)且列数加1(列数右移一列);(3)若填入的数字在该行的最右侧,则下一个数字就填在上一行的最左侧;(4)一般地,下一个数字在前一个数字的右上方(行数少1,列数加1);(5)若应填的地方已经有数字或在方阵之外,则下一个数字就填在前一个数字的下方。

C语言实现魔方阵

C语言实现魔方阵

(1)魔方阵 ①问题描述魔方阵是一个古老的智力问题,它要求在一个m ×m 的矩阵中填入1~m 2的数字(m 为奇数),使得每一行、每一列、每条对角线的累加和都相等,如图1所示。

②基本要求● 输入魔方阵的行数m ,要求m 为奇数,程序对所输入的m 作简单的判断,如m 有错,能给出适当的提示信息。

● 实现魔方阵。

● 输出魔方阵。

③实现提示本实验使用的数据结构是数组。

解魔方阵问题的方法很多,这里采用如下规则生成魔方阵。

● 由1开始填数,将1放在第0行的中间位置。

● 将魔方阵想象成上下、左右相接,每次往左上角走一步,会有下列情况:✧ 左上角超出上方边界,则在最下边相对应的位置填入下一个数字; ✧ 左上角超出左边边界,则在最右边相应的位置填入下一个数字; ✧ 如果按上述方法找到的位置已填入数据,则在同一列下一行填入下一个数字。

以3×3魔方阵为例,说明其填数过程,如图2所示。

图2 三阶魔方阵的生成过程由三阶魔方阵的生成过程可知,某一位置(x,y)的左上角的位置是(x-1,y-1),如果x-1≥0,不用调整,否则将其调整为x-1+m ;同理,如果y-1≥0,不用调整,否则将其调整为y-1+m 。

所以,位置(x,y)的左上角的位置可以用求模的方法获得,即:x=(x-1+m)%my=(y-1+m)%m如果所求的位置已经有数据了,将该数据填入同一列下一行的位置。

这里需要注意的是。

此时的x和y已经变成之前的上一行上一列了,如果想变回之前位置的下一行同一列,x需要跨越两行,y需要跨越一列,即:x=(x+2)%my=(y+1)%m源代码:#include<stdio.h>void mofangzhen(int m){int a[100][100];int b,x,y;for(x=0;x<m;x++){for(y=0;y<m;y++)a[x][y]=0;}x=0;y=(m-1)/2;a[x][y]=1;for(b=2;b<=m*m;b++){if(x-1<0) x=(x-1+m)%m;else x=x-1;if(y-1<0) y=(y-1+m)%m;else y=y-1;if(a[x][y]!=0){x=(x+2)%m;y=(y+1)%m;}a[x][y]=b;}for(x=0;x<m;x++){for(y=0;y<m;y++)printf("%4d",a[x][y]);printf("\n");}}void main(){int m;m=0;while(m%2!=1){printf("请输入矩阵阶数m(奇数):");scanf("%d",&m);if(m%2!=1)printf("m输入错误\n");}mofangzhen(m);}。

c语言经典案例

c语言经典案例

1、用筛选法求100之内的素数。

#include <stdio.h>void main(){int num[100],i,j;for (i=0;i<100;i++) num[i]=1;for (i=2;i<=10;i++)for (j=2;i*j<=100;j++) num[i*j-1]=0;printf("0至100内素数有:\n");for (i=j=0;i<100;i++)if (num[i]==1) {printf("%-4d",i+1);if (++j%4==0) printf("\n");}}2、用选择法对10个整数排序。

#include <stdio.h>void main(){int num[10],n,i,j,t,k;printf("请输入十个整数:");for (n=0;n<10;n++) scanf("%d",&num[n]);for (i=0;i<9;i++){k=i;for (j=i+1;j<10;j++)if (num[k]<num[j]) k=j;if (k!=i) {t=num[i];num[i]=num[k];num[k]=t;}}printf("从大到小排序为:");for (n=0;n<10;n++) printf("%d ",num[n]);}3、求一个3*3的整型二维数组对角线元素之和。

#include <stdio.h>void main(){int num[3][3],i,j;printf("输入二维数组:\n");for (i=0;i<3;i++)for (j=0;j<3;j++)scanf("%d",&num[i][j]);printf("两对角线和分别为%d 和%d\n",num[0][0]+num[1][1]+num[2][2],num[0][2]+num[1][1]+num[2][0]);}5、将一个数组中的值按逆序重新存放。

C语言奇偶排序算法详解及实例代码

C语言奇偶排序算法详解及实例代码

C语言奇偶排序算法详解及实例代码奇偶排序(Odd-Even Sort)算法是一种简单的排序算法,它可以同时对数组中的奇数和偶数进行排序。

这个算法的原理比较简单,它的思想类似冒泡排序,只不过比较的对象从相邻的两个数变为了相隔一个位置的两个数。

奇偶排序算法的步骤如下:1.将数组分为两个部分,分别存放奇数和偶数。

2.在奇数部分中进行一轮冒泡排序,将较大的数往右移。

3.在偶数部分中进行一轮冒泡排序,将较小的数往左移。

4.重复执行步骤2和步骤3,直到数组完全有序。

下面我们来详细解析奇偶排序算法,并给出一个实例代码。

1. 定义一个函数 `void oddEvenSort(int arr[], int n)`,用于实现奇偶排序。

2. 在函数内部创建两个变量 `sorted` 和 `exchange`,分别表示数组是否已经完全有序和两个相邻元素是否发生交换。

3. 使用一个循环,首先将 `sorted` 和 `exchange` 初始化为`false`。

4. 使用两个嵌套循环,外层循环控制数组两个部分的排序,内层循环控制每个部分的冒泡排序。

5. 内层循环的初始条件为 `j = i % 2`,其中 `i` 表示当前循环的次数。

当 `i` 为偶数时,`j` 为 0,表示要对偶数部分排序;当`i` 为奇数时,`j` 为 1,表示要对奇数部分排序。

6. 内层循环用于对数组中的一部分进行冒泡排序,如果发生交换,则将 `exchange` 设置为 `true`。

冒泡排序的过程和一般的冒泡排序算法类似。

7. 当内层循环结束后,判断 `exchange` 是否为 `false`,如果是,则说明数组已经完全有序,将 `sorted` 设置为 `true`,并退出外层循环。

8. 最后,在函数末尾添加一个循环,用于输出排序后的数组。

下面是完整的实例代码:```c#include <stdio.h>void swap(int *a, int *b){int temp = *a;*a = *b;*b = temp;}void oddEvenSort(int arr[], int n)int sorted = 0; // 数组是否已经完全有序int exchange = 0; // 两个相邻元素是否发生交换 while (!sorted){sorted = 1;for (int i = 0; i < n - 1; i++){exchange = 0;int j = i % 2;for (; j < n - 1; j += 2){if (arr[j] > arr[j + 1]){swap(&arr[j], &arr[j + 1]);exchange = 1;sorted = 0;}}if (!exchange){break;}}}}int main(){int arr[] = {9, 2, 7, 4, 5, 6, 3, 8, 1};int n = sizeof(arr) / sizeof(arr[0]);oddEvenSort(arr, n);for (int i = 0; i < n; i++){printf("%d ", arr[i]);}return 0;}```以上是奇偶排序算法的详细解析及一个示例代码。

C语言实现奇数阶魔方阵的方法

C语言实现奇数阶魔方阵的方法

C语⾔实现奇数阶魔⽅阵的⽅法本⽂实例讲述了C语⾔实现奇数阶魔⽅阵的⽅法。

分享给⼤家供⼤家参考。

具体实现⽅法如下:复制代码代码如下:#include "stdio.h"#include "string.h"#include "stdlib.h"#define N 5void main(){int a[N][N]={0};int i,j;int k;i = 0;j = N/2;a[0][j]=1;for(k = 2; k <= N*N; k++){if( i == 0 && j == N-1 ){//先判断前⼀个数是不是最右上⾓的数,若是后⼀个数直接填在前⼀个数下⽅i=i+1;a[i][j] = k;continue;}i = (i-1+N)%N;//计算前⼀个数右上⾓的坐标j = (j+1)%N;if(a[i][j] != 0){//若前⼀个数的右上⾓有元素,后⼀个数直接填在前⼀个数下⽅i = ((i+1)%N+1)%N;//恢复坐标j = (j-1+N)%N;a[i][j] = k;}else{//上述条件均不满⾜,后⼀个数放在前⼀个数的右上⾓a[i][j] = k;}}for(i = 0; i < N; i++){for(j = 0; j < N; j++){printf("M",a[i][j]);}printf("\n");}}测试数据如下:N = 38 1 63 5 74 9 2希望本⽂所述对⼤家的C语⾔程序设计有所帮助。

c语言魔方阵课程设计

c语言魔方阵课程设计

c语言魔方阵课程设计一、教学目标本课程的目标是让学生掌握C语言编程基础,学会使用C语言编写魔方阵,并培养学生的逻辑思维能力和编程实践能力。

具体目标如下:1.知识目标:–掌握C语言的基本语法和数据类型。

–学会使用C语言进行条件判断和循环控制。

–理解函数的定义和调用。

–学习魔方阵的生成原理和算法。

2.技能目标:–能够使用C语言编写简单的程序。

–学会使用C语言编写魔方阵程序。

–培养学生的编程实践能力和问题解决能力。

3.情感态度价值观目标:–培养学生的学习兴趣和主动性。

–培养学生的团队合作意识和沟通能力。

–培养学生的创新思维和自我探索精神。

二、教学内容本课程的教学内容主要包括C语言的基本语法和数据类型、条件判断和循环控制、函数的定义和调用,以及魔方阵的生成原理和算法。

具体安排如下:1.C语言的基本语法和数据类型:介绍C语言的基本语法规则,包括变量声明、数据类型、运算符、表达式等。

2.条件判断和循环控制:介绍条件语句(if-else)和循环语句(for、while)的使用,以及它们的嵌套和应用。

3.函数的定义和调用:介绍函数的定义、声明和调用方式,以及函数的参数传递和返回值。

4.魔方阵的生成原理和算法:介绍魔方阵的定义和生成原理,以及常用的魔方阵生成算法。

三、教学方法本课程的教学方法采用讲授法、案例分析法和实验法相结合的方式。

具体方法如下:1.讲授法:通过教师的讲解和演示,让学生掌握C语言的基本语法和数据类型、条件判断和循环控制、函数的定义和调用等知识。

2.案例分析法:通过分析具体的魔方阵案例,让学生理解魔方阵的生成原理和算法,并学会使用C语言编写魔方阵程序。

3.实验法:通过编程实验,让学生亲自动手编写程序,培养学生的编程实践能力和问题解决能力。

四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备。

具体资源如下:1.教材:选用《C程序设计语言》作为主要教材,介绍C语言的基本语法和数据类型、条件判断和循环控制、函数的定义和调用等内容。

魔方阵 C语言

魔方阵 C语言

一、幻方按照阶数可分成了三类,即奇数阶幻方、双偶阶幻方、单偶阶幻方。

二、奇数阶幻方(劳伯法)奇数阶幻方最经典的填法是罗伯法。

填写的方法是:把1(或最小的数)放在第一行正中;按以下规律排列剩下的(n×n-1)个数:(1)每一个数放在前一个数的右上一格;(2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;(3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;(4)如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在底行且最左列;(5)如果这个数所要放的格已经有数填入,那么就把它放在前一个数的下一行同一列的格内。

例,用该填法获得的5阶幻方:三、单偶数阶幻方(斯特拉兹法)所谓单偶阶幻方就是当n不可以被4整除时的偶阶幻方,即4K+2阶幻方。

如(n=6,10,14……)的幻方。

单偶数阶幻方最经典的填法是斯特拉兹法。

填写的方法是:以10阶幻方为例。

这时,k=2。

(1)把魔方阵分为A,B,C,D四个象限,这样每一个象限肯定是奇数阶。

用罗伯法,依次在A象限,D象限,B象限,C象限按奇数阶幻方的填法填数。

(2)在A象限的中间行、中间格开始,按自左向右的方向,标出k格。

A象限的其它行则标出最左边的k格。

将这些格,和C象限相对位置上的数互换位置。

(3)在B象限所有行的中间格,自右向左,标出k-1格。

(注:6阶幻方由于k-1=0,所以不用再作B、D象限的数据交换),将这些格,和D象限相对位置上的数互换位置。

四、源代码如下,已加详细注释#include<stdio.h>#include<stdlib.h>int array[15][15];intinit(int degree) //初始化{inti;int j;for(i=0; i<=degree+1; i++)for(j=0; j<=degree+1; j++)array[i][j] = 0;return 0;}inttest_print(int x, int y, int w, int h) //测试用的,输出以(x,y)为原点,宽为w,高为h,这个区域的数值{inti;int j;for(i=y; i<=y+h-1; i++){for(j=x; j<=x+w-1; j++){printf("%2d ",array[i][j]);}printf("\n");}return 0;}intlao_bo_er(int degree, int x, int y, intnum) //劳伯法{inti;int j;int k;i = y;j = degree/2 + x;for(k=num; k<=num+degree*degree-1; k++){array[i][j] = k;if((k-num+1)%degree == 0){ //如果这个数所要放的格已经有数填入i = (i-y+1)%degree+y;}else{ //每一个数放在前一个数的右上一格i = (i-y-1+degree)%degree+y;j = (j-x+1)%degree+x;}}return 0;}intseq_range(int degree) //把数字按顺序填{inti;int j;intnum;num = 1;for(i=1; i<=degree; i++){for(j=1; j<=degree; j++){array[i][j] = num++;}}return 0;}intsi_te_la_zi(int degree, int x, int y, intnum) //斯特拉兹法{intdeg;int k;int temp;inti;int j;deg = degree/2;lao_bo_er(deg, x, y, num); //用罗伯法,依次在A象限,D象限,B象限,C象限按奇数阶幻方的填法填数lao_bo_er(deg, x+deg, y, num+2*deg*deg);lao_bo_er(deg, x, y+deg, num+3*deg*deg);lao_bo_er(deg, x+deg, y+deg, num+deg*deg);k = (degree-2)/4;for(i=1; i<=deg; i++){ //A象限和C象限对换数据for(j=1; j<=k; j++){temp = array[i][j];array[i][j] = array[i+deg][j];array[i+deg][j]=temp;}for(j=deg+deg/2+1; j>=deg+deg/2-k+3; j--){temp = array[i][j];array[i][j] = array[i+deg][j];array[i+deg][j]=temp;}}for(i=j=1; j<=deg/2+k; j++){ //B象限和D象限对换数据temp = array[i+deg/2][j];array[i+deg/2][j] = array[i+deg+deg/2][j];array[i+deg+deg/2][j]=temp;}return 0;}inthai_er_fa(int degree) //海尔法{inti;int j;int complement;intdeg;seq_range(degree);complement = degree*degree+1;deg = degree/4;for(i=0; i<deg; i++){for(j=0; j<deg; j++){ //对角线上的数字换成和它互补的数array[i*4+1][j*4+1] = complement -array[i*4+1][j*4+1];array[i*4+1][j*4+4] = complement -array[i*4+1][j*4+4];array[i*4+4][j*4+1] = complement -array[i*4+4][j*4+1];array[i*4+4][j*4+4] = complement -array[i*4+4][j*4+4];array[i*4+2][j*4+2] = complement -array[i*4+2][j*4+2];array[i*4+2][j*4+3] = complement -array[i*4+2][j*4+3];array[i*4+3][j*4+2] = complement -array[i*4+3][j*4+2];array[i*4+3][j*4+3] = complement -array[i*4+3][j*4+3];}}return 0;}int main(){int degree;printf("please input the degree\n");scanf("%d",&degree);init(degree);if(degree%2 == 1){ //奇数阶幻方lao_bo_er(degree,1,1,1);test_print(1,1,degree,degree);}else if(degree%4 == 2){ //双偶阶幻方si_te_la_zi(degree, 1, 1, 1);test_print(1,1,degree,degree);}else{ //单偶阶幻方hai_er_fa(degree);test_print(1,1,degree,degree);}return 0;}。

输出魔方阵

输出魔方阵
for(i=0;i<n;i++)//各列的和
for(j=0;j<n;j++)a[n][i]+=a[j][i];
for(i=0;i<n;i++)a[n][n]+=a[i][i];//主对角线的和
}
void main()
{
int n;
int a[M][M]={0};
printf("魔方阵的阶数n=");//n为大于2的任意整数
}
}
//三、当n为单偶数(n=4k+2)时,可把方阵分为4个2k+1的小方阵,编号如下:
//1.各小方阵按奇数阶算法依次填入A(1…[2k+1]2)、B([2k+1]2+1…2[2k+1]2)、C(…)、D(…4[2k+1]2);
//2.将A与D换:A中间格始向右取k格;A最左边的k列(除中行);
//3.将C与B互换:从C的中间列开始向左数k-1列。
MagicOdd(a,0,m,2*m*m+1,m);//C阵(右上)
MagicOdd(a,m,0,3*m*m+1,m);//D阵(左下)
for(j=k;j<m-1;j++){//从A的中间格开始向右数k格...
t=a[k][j];
a[k][j]=a[k+m][j];//...与D对应位置交换
a[k+m][j]=t;
}
void MagicSev(int a[M][M],int st,int n)//单偶4k+2阶魔方阵,起始数st
{
int m=n/2,k=m/2;//将原矩阵分为2×2的方阵

【C语言】魔方阵

【C语言】魔方阵

【C语⾔】魔⽅阵打印魔⽅阵,所谓魔⽅阵是指这样的⽅阵,它的每⼀⾏、每⼀列和对⾓线之和均相等。

例如,三阶魔⽅阵为: 8 1 63 5 74 9 2要求打印出由1到n2的⾃然数构成的魔⽅阵(n为奇数)。

魔⽅阵中各数的排列规律如下:(1)将1放在第⼀⾏中间⼀列;(2)从2开始直到n×n,各数依次按下列规律存放:每⼀个数存放的⾏⽐前⼀个数的⾏数减1,列数加1;(3)如果上⼀个数的⾏数为1,则下⼀个数的⾏数为n(指最下⼀⾏);(4)当上⼀个数的列数为n时,下⼀个数的列数应为1,⾏数减1;(5)如果按上⾯规则确定的位置上已有数,或上⼀个数是第1⾏第n列时,则把下⼀个数放在上⼀个数的下⾯。

**输⼊数据格式:"%d"**输出格式要求:"%3d"程序的运⾏⽰例如下:请输⼊n(0<n<=15,n是奇数):5矩阵阶数是:517 24 1 8 1523 5 7 14 164 6 13 20 2210 12 19 21 311 18 25 2 91 #include<stdio.h>23int main() {4int a[15][15],i=0,j=0,k=0,p=0,n=0;5 p=1;6while(p==1) {7 printf("请输⼊n(0<n<=15,n是奇数):\n");8 scanf("%d",&n);9if ((n>=0) && (n<=15) && (n%2!=0))10 p=0;11 }12 printf("矩阵阶数是:%d\n",n);13for(i=1; i<=n; i++) { //初始化操作14for(j=1; j<=n; j++)15 a[i][j]=0;16 }17 j=n/2+1;18 a[1][j]=1;19for(k=2; k<=n*n; k++) {20 i=i-1;21 j=j+1;22if((i<1)&&(j>n)) {23 i=i+2;24 j=j-1;25 } else {26if(i<1)27 i=n;28if(j>n)29 j=1;30 }31if(a[i][j]==0) {32 a[i][j]=k;33 } else {34 i=i+2;35 j=j-1;36 a[i][j]=k;37 }38 }39for (i=1; i<=n; i++) {40int sum=0;41for (j=1; j<=n; j++) {42 printf("%3d",a[i][j]);43 sum+=a[i][j];44 }45 printf("\n");46 }47 printf("\n\n");48return0;49 }。

C++实例奇数阶魔方阵问题

C++实例奇数阶魔方阵问题

奇数阶魔⽅阵是指由1到n2(n为奇数)个⾃然数构成的n*n的⽅阵,它的每⼀⾏,每⼀列,和对⾓线各元素之和均相等,3阶的魔⽅阵如下: 8 1 6 3 5 7 4 9 2 n阶魔⽅阵的构造⽅法为: 1> ⾸先把1放在顶⾏的正中间,然后把后继数按顺序放置在右上斜的对⾓线上; 2> 当到达顶⾏时,下⼀个数放到底⾏,好像它在顶⾏的上⾯; 3> 当到达最右列时,下⼀个数放在最左端列,好像它仅靠在右端列的右⽅; 4> 当到达的位置已经填好数时,考试⼤提⽰:或到达右上⾓的位置时,下⼀个数就放在刚填写的位置的正下⽅。

C++函数如下: /*奇数阶魔⽅阵问题*/ #include using namespace std; const int MAX=50; void main() { int matrix[MAX][MAX]; int count; int row; int column; int order; cout<<"请输⼊阶数:"; cin>>order; if(order%2==0) { cout<<"阶数必须是⼀个奇数,请重新输⼊!"< } else { row=0; column=order/2; for(count=1;count<=order*order;count++) { matrix[row][column] = count; if (count % order == 0) { row++; } else { row = (row == 0) ? order - 1 : row - 1; column = (column == order-1) ? 0 : column + 1; } } for (row = 0; row < order; row++) { for (column = 0; column < order; column++) { cout<<"\t"< } cout< } } } 程序运⾏打印出相应的n阶魔⽅阵.。

C语言实现魔方阵算法

C语言实现魔方阵算法

C语言实现魔方阵算法C语言实现魔方阵算法魔方阵分为奇幻方和偶幻方,本文特意为大家收集整理了C语言实现魔方阵算法,希望大家喜欢!例如三阶魔方阵为:C语言实现魔方阵算法(幻方阵奇魔方单偶魔方实现)1魔方阵有什么的规律呢?魔方阵分为奇幻方和偶幻方。

而偶幻方又分为是4的倍数(如4,8,12……)和不是4的倍数(如6,10,14……)两种。

下面分别进行介绍。

2 奇魔方的算法2.1 奇魔方的规律与算法奇魔方(阶数n = 2 * m + 1,m =1,2,3……)规律如下:数字1位于方阵中的第一行中间一列;数字a(1 < a ≤ n2)所在行数比a-1行数少1,若a-1的行数为1,则a的行数为n;数字a(1 < a ≤ n2)所在列数比a-1列数大1,若a-1的列数为n,则a的列数为1;如果a-1是n的倍数,则a(1 < a ≤ n2)的行数比a-1行数大1,列数与a-1相同。

2.2 奇魔方算法的'C语言实现复制代码代码如下:#include <stdio.h>// Author: /// N为魔方阶数#define N 11int main(){int a[N][N];int i;int col,row;col = (N-1)/2;row = 0;a[row][col] = 1;for(i = 2; i <= N*N; i++){if((i-1)%N == 0 ){row++;}else{// if row = 0, then row = N-1, or row = row - 1 row--;row = (row+N)%N;// if col = N, then col = 0, or col = col + 1col ++;col %= N;}a[row][col] = i;}for(row = 0;row<N;row++){for(col = 0;col < N; col ++){printf("%6d",a[row][col]);}printf("n");}return 0;}算法2:阶数n = 4 * m(m =1,2,3……)的偶魔方的规律如下:按数字从小到大,即1,2,3……n2顺序对魔方阵从左到右,从上到下进行填充;将魔方阵分成若干个4×4子方阵,将子方阵对角线上的元素取出;将取出的元素按从大到小的顺序依次填充到n×n方阵的空缺处。

任意阶魔方阵算法(c语言)

任意阶魔方阵算法(c语言)

任意阶魔方阵算法2009-03-19 11:45:00| 分类:我的文章|字号大中小订阅我一直就对魔方阵很感兴趣,特别是知道了奇数阶魔方阵的罗伯特算法后,就特别想知道偶数阶魔方阵应有什么算法。

当时书上说偶数阶魔方阵比较复杂。

都没有什么说明。

因此这个问题一直搁在我心里很久,已差不多快忘记了。

今天突然又想到了这个问题。

于是我开始在网上搜寻,看能不能找到什么好的算法。

记得在高中的时候,我就做过魔方阵,当时我从三阶一直做到过八阶方阵,不过用的是人工的方法。

到大学的时候我知道了罗伯特算法后,我就用程序将算法写了出来。

于是我今天准备把偶数阶的魔方阵也写出来。

在网上终于找到了一个比较好的算法。

将该算法用C写了出来。

供大家分亨。

1、奇数阶幻方n为奇数(n=3,5,7,9,11……) (n=2*k+1,k=1,2,3,4,5……)奇数阶幻方最经典的填法是罗伯特法(也有人称之为楼梯方)。

填写方法是这样:把1(或最小的数)放在第一行正中;按以下规律排列剩下的n*n-1个数:(1)、每一个数放在前一个数的右上一格;(2)、如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;(3)、如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;(4)、如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内;(5)、如果这个数所要放的格已经有数填入,处理方法同(4)。

这种写法总是先向“右上”的方向,象是在爬楼梯。

2、双偶阶幻方n为偶数,且能被4整除(n=4,8,12,16,20……) (n=4k,k=1,2,3,4,5……)先说明一个定义:互补:如果两个数字的和,等于幻方最大数和最小数的和,即n*n+1,称为互补。

先看看4阶幻方的填法:将数字从左到右、从上到下按顺序填写:1 2 3 45 6 7 89 10 11 1213 14 15 16这个方阵的对角线,已经用蓝色标出。

C语言---魔方阵

C语言---魔方阵

C语⾔---魔⽅阵魔⽅阵的定义:在n*n的⽅阵中,每⼀⾏的和=每⼀列的和=对⾓线的和。

(本⽂中涉及的n为⼤于3的奇数)。

例如3*3的魔⽅阵为:5*5的魔⽅阵为:如何写魔⽅阵呢?1.数字1位于第⼀⾏的正中间2.下⼀个数放到上⼀个数的右上⾓(即上⼀⾏下⼀列),若⽆上⼀⾏则放到最后⼀⾏,若⽆下⼀列则放到第⼀列3.若新位置已经放了数,则将其放⼊该数的正下⽅(即下⼀⾏的同⼀列)C语⾔代码:1int magicMatrix() {2 printf("请输⼊你想⽣成的魔⽅阵阶数:(⼤于3的奇数)\n");3int i,c,r;4 scanf("%d",&i);5int arr[i][i];6for(int n=0; n<i; n++) {7for(int m=0; m<i; m++) {8 arr[n][m]=0;9 }10 }11 c=0;12 r=i/2;13 arr[c][r] = 1;// 魔⽅阵的第⼀⾏最中间的数为114int k=i*i;15for(int j=2; j<=k; j++) {16int h=c,l=r; //记录原来的位置17if(c==0) {18 c=i-1;19 } else {20 c=c-1;21 }22if(r==i-1) {23 r=0;24 } else {25 r=r+1;26 }27if(arr[c][r]!=0) {28 c=h+1;29 r=l;30 }31 printf("c=%d,r=%d,j=%d\n",c,r,j);32 arr[c][r]=j;33 }34 printf("\n");35for(int n=0; n<i; n++) {36for(int m=0; m<i; m++) {37 printf("%d\t",arr[n][m]);38 }39 printf("\n");40 }41 }计算下⼀个数字的位置时,如果位置已经被占,就在该数的下⼀⾏同⼀列,所以代码中每次计算要记录该数的位置。

C语言魔方阵的三种实现方法

C语言魔方阵的三种实现方法

C语⾔魔⽅阵的三种实现⽅法⽬录魔⽅阵:1.奇数阶魔⽅阵2.偶数阶魔⽅阵(n=4K)3.偶数阶魔⽅阵(n=4K+2)魔⽅阵:把1到n*n排成n⾏n列⽅阵,使⽅阵中的每⼀⾏、每⼀列以及对⾓线上的数之和都相同,即为n阶魔⽅阵。

根据魔⽅阵的规律,我将它分为三种情况。

1.奇数阶魔⽅阵规律:第⼀个数放在第⼀⾏的中间,下⼀个数放在上⼀个数的上⼀⾏下⼀列,若该位置已经有了数字即放在上个数的下⾯⼀⾏的相同列⽤C语⾔编程如下:⽰例:n=5;#include<stdio.h>#include<stdlib.h>#include<assert.h>void Magic1(){#define ROW 5#define COL ROWassert(ROW % 2 != 0); //判断n是否为奇数int arr[ROW][COL] = { 0 }; //定义⼆维数组int currow = 0;int curcol = COL / 2;arr[currow][curcol] = 1;for (int i = 2; i <= ROW * COL; i++){if (arr[(currow - 1 + ROW) % ROW][(curcol + 1) % COL] == 0) //按照规律赋值{currow = (currow - 1 + ROW) % ROW;curcol = (curcol + 1) % COL;}else{currow = (currow + 1) % ROW;}arr[currow][curcol] = i;}for (int i = 0; i < ROW; i++) //打印魔⽅阵{for (int j = 0; j < COL; j++){printf("%-3d", arr[i][j]);}printf("\n");}}int main(){Magic1();return 0;}结果:2.偶数阶魔⽅阵(n=4K)规律:按数字从⼩到⼤,即1,2,3……n顺序对魔⽅阵从左到右,从上到下进⾏填充;将魔⽅阵分成若⼲个4×4⼦⽅阵(如:8阶魔⽅阵可分成四个4×4⼦⽅阵),将⼦⽅阵对⾓线上的元素取出;将取出的元素按从⼤到⼩的顺序依次填充到n×n⽅阵的空缺处。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n的平方的n×n 的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。

如3×3的魔方阵:
8 1 6 =15
3 5 7 =15
4 9 2 =15
|| || ||
15 15 15 15(对角线)
魔方阵的排列规律(奇数阵):
1.将1放在第一行中间一列。

2.从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1。

3.如果上一个数的行数为1,则下一个数的行数为n,列数加1。

如果上一个数的列数的n时,下一个数的列数为1,行数减1。

4.如果按上面的规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。

#include <stdio.h>
main()
{ int a[16][16],i,j,k,p,n;
p=1;
while(p==1) /*要求阶数为1~15的奇数*/ { 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;
i=1;
for(k=2;k<=n*n;k++)
{ i=i-1;
j=j+1;
if((i<1)&&(j>n)) /*上一个数是第一行第n列时,则把下一个数放在上一个数的下面*/
{ i=i+2;
j=j-1;
}
else
{ if(i<1) i=n; /*上一个数的行数为1,则下一个数的行数为n,上一个数的列数的n时,下一个数的列数为1*/
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");
}
}
n=5:。

相关文档
最新文档