求助C语言高手,关于魔方矩阵的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助C语言高手,关于魔方矩阵的问题相关的知识,希望对你有一定的参考价值。
把整数1到n2排成一个n×n方阵, 使方阵中的每一行, 每一列以及对角线上的数之和都相同。
①n阶魔方阵的产生;生成后的魔方阵要写入文件。
②最大值的位置;
③指定行的排序,排序方法不限;
④求素数;
⑤求完数;
⑥求水仙花数;
⑦退出。
(2)功能要求
①系统以菜单方式工作;菜单形式不限。
②界面比较美观。
③要有一定的容错能力,比如说按行排序是输入一个不存在的行号,输入的魔方阵阶数为偶数等。
(3)算法分析
如n为奇数, 魔方阵可按下述方法构成:
(1) 把1填在第一行的正中间, 然后填入后续的数;
(2) 若数k填在第i行第j列的格子中, 那么k+1应填在它的左上方, 即第i-1行第j-1列的那个格子中, 如果左上方无格子,即:若i-1为0, 那么填在第n行第j-1列的格子中;若j-1为0, 那么填在第i-1行第n列的格子中; 若i-1和j-1都为0, 那么填在第n行第n列的格子中。
(3) 若按(2)的方法找到的格子中已填过数了, 那么数k+1改填在第k个数的正下方。即填在第i+1行和第j列的那个格子中。
#include <conio.h>
#define N 15
void main()
int iArr[N][N] = 0; /*魔法阵数组*/
/*定义变量,i,j为循环控制变,iNum表示数组的行数列数,iPox、iPoy分别代表数组的行数、列数,iPosx、iPosy分别代表保存数组行数变量,保存数组列数变量*/
int i = 0, j = 0, iNum = 0, iPosx = 0, iPosy = 0, iPox = 0, iPoy = 0;
printf("input the number:\n"); /*输入数组的行数列数*/
scanf("%d",&iNum);
if (iNum % 2 == 0 || iNum > 15 || iNum <= 0) /*判断iNum是否为奇数*/
printf("ERROR!"); /*偶数,输出错误提示*/
else
/*为奇数,进行处理*/
iPox = 0;
iPoy = iNum / 2; /*算出1所在的位置*/
for (i=1; i<=iNum*iNum; i++)
iArr[iPox][iPoy] = i;
iPosx = iPox;
iPosy = iPoy;
if (iPox == 0) /*如果上一个数的行数为第一行,则下一个数的行数为最下一行,列数同样加1;*/
if (iPoy != iNum-1) /*上一个数是第一行最后一列时,则把下一个数放在上一个数的下面*/
iPox = iNum-1;
else
/*每一个数存放的行比前一个数的行数减1,列数加1(右上方)*/
iPox++;
iPoy--;
else
iPox--;
if (iPoy == iNum-1) /*当上一个数的列数为最后一列时,下一个数的列数应为第一列,行数减去1;*/
iPoy = 0;
else
iPoy++;
if (iArr[iPox][iPoy] != 0) /*如果按上面规则确定的位置上已有数时,则把下一个数放在上一个数的下面*/
iPox = iPosx+1;
iPoy = iPosy;
printf("The array is :\n");
for (i=0; i<iNum; i++) /*输出该数组*/
for (j=0; j<iNum; j++)
printf("%3d",iArr[i][j]);
printf("\n");
getch();
追问
你这是一个矩阵而已,后面的那些内容我还不懂哦
追答这就是个魔方矩阵,我把我的这个要求给你看看,你看看是不是:输出魔方阵。所谓魔方阵是指行、列为奇数的方阵N×N,把1~N2这N2个不同的数放入方阵中,它的每一行,每一列和对角线上元素之和均相等。
魔方阵的排列规律如下:
(1)将1放在第一行中间一列;
(2)从2开始直到N×N止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(右上方);
(3)如果上一个数的行数为第一行,则下一个数的行数为最下一行,列数同样加1;
(4)当上一个数的列数为最后一列时,下一个数的列数应为第一列,行数减去1;
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行最后一列时,则把下一个数放在上一个数的下面。
编写程序,对于输入的小于15的N,输出其相应的魔方阵
#define N 99
int main(void)
int n,magic[N][N]=0;
int i,j,k,temp;
int x,y;
printf("please enter an odd number:");
scanf("%d",&n);
temp=n/2;
magic[0][temp]=1;
i=0;j=temp;
for(k=2;k<=(n*n);k++)
if(i-1>=0&&j+1<n)//下一步子(x,y)范围合格
if(magic[i-1][j+1]!=0)//已有子
magic[i+1][j]=k;
i=i+1;
else//没有子
magic[i-1][j+1]=k;
i=i-1;
j=j+1;
else if(i-1<0&&j+1<n)//x不合格,y范围合格
x=n-1;
if(magic[x][j+1]!=0)//因为可能下一步已有数字
magic[i+1][j]=k;//此处要在原有数字的正下方放数,要用到原有的i的值,故上步借助了变量x
i=i+1;
else
magic[x][j+1]=k;
i=x;
j=j+1;
else if(i-1>=0&&j+1>=n)
y=0;
if(magic[i-1][y]!=0)
magic[i+1][j]=k;
i=i+1;
else
magic[i-1][y]=k;
i=i-1;
j=y;
else if(i-1<0&&j+1>=n)
x=n-1;
y=0;
if(magic[x][y]!=0)
magic[i+1][j]=k;
i=i+1;
else
magic[x][y]=k;
i=x;
j=y;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
printf("%3d",magic[i][j]);
printf("\n");
printf("\n");
return 0;
参考技术B 楼上说的很好。。我惭愧了。 参考技术C 这个算法不对吧??
C语言编程,求助高手
我定义了一个结构体
struct User
char name[10];
int score
;
并创建了一个结构体数组
User*array,里面有n个元素,下标分别为0~n-1;
现在我有两个常量user_name和user_score,想在结构体数组中添加元素array(n)
于是我尝试了各种初始化方法,但都无法解决,求大神帮忙
你的动态数组只有n个元素,已经装满了的话,就需要扩容。
具体看例子。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct User
char name[10];
int score;
;
int main()
const char user_name[]="wonder";
const int user_score=99;
//c表示容量,n表示元素数量,incr表示每次扩容时的增量
int c=1,n=0,incr=10;
int i;
struct User *array=(struct User*)calloc(c,sizeof(struct User));
strcpy(array[0].name,"name1");
array[0].score=1;
n++;
printf("追加用户前:\\n");
for(i=0;i<n;i++)
printf(n-1!=i ? "%s %d," : "%s %d\\n",
array[i].name,array[i].score);
//n>=c说明动态数组array已装满,需扩容
if(n>=c)
printf("对动态数组array进行扩容\\n");
c+=incr;
array=(struct User*)realloc(array,sizeof(struct User)*c);
//追加
strcpy(array[n].name,user_name);
array[n].score=user_score;
n++;
printf("追加用户后:\\n");
for(i=0;i<n;i++)
printf(n-1!=i ? "%s %d," : "%s %d\\n",
array[i].name,array[i].score);
free(array);
return 0;
参考技术A 初始化的类型不能直接用User,必须加上struct。而且数组初始化时元素个数必须是定值,初始化以后元素个数是不可以改变的。比如初始化数组,元素有10个:
struct User array[10];
如果想增加元素,必须用链表的形式:
struct User *array;
然后用malloc动态分配内存。追问
malloc分配内存的那一步怎么写呀
是array[n]=(User*)malloc(sizeof(User))吗
array=(struct User*)malloc(10*sizeof(struct User));
以上是关于求助C语言高手,关于魔方矩阵的问题的主要内容,如果未能解决你的问题,请参考以下文章