A. c语言中魔方阵编程的思路
/*
所谓魔方阵是指这样的的方阵:
它的每一行、每一列和对角线之和均相等。
输入n,要求打印由自然数1到n2的自然数构成的魔方阵(n为奇数)。
例如,当n=3时,魔方阵为:
8 1 6
3 5 7
4 9 2
魔方阵中各数排列规律为:
① 将“1”放在第一行的中间一列;
② 从“2”开始直到n×n为止的各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数同样加1;
③ 如果上一数的行数为1,则下一个数的行数为n(最下一行),如在3×3 方阵中,1在第1行,则2应放在第3行第3列。
④ 当上一个数的列数为n时,下一个数的列数应为1,行数减1。如2在第3行第3列,3应在第2行第1列。
⑤如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
如按上面的规定,4应放在第1行第2列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第3列(即最后一列),故7放在6下面。
*/
#include"stdio.h"
void main()
{
int i,n=5;
printf("---------------打印魔方阵-------------\n\n");
int a[5][5];
for( i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=0;//初始化
i=0;
int j=n/2;
int t=1;
int si=0;
int sj=0;//记录上一个数的位置
while(t<=n*n)
{
//printf("\n%4d\n\n",t);
if(a[i][j]==0)
a[i][j]=t;
else
{
if(si==0 && sj==n-1)
{
a[si+1][sj]=t;
i=si+1;
j=sj;
}
if(si!=n-1)
{
a[si+1][sj]=t;
i=si+1;
j=sj;
}
if(si==n-1)
{
a[0][sj]=t;
i=0;
j=sj;
}
}
si=i;
sj=j;
/*计算下一个元素的位置*/
if(i==0)
i=n-1;
else
i=i-1;
if(j==n-1)
j=0;
else
j=j+1;
t=t+1;
}
for(i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n\n");
}
}
B. c语言 如何求三阶魔方阵,最好带注释
#include <stdio.h>
#include <math.h>
#define N 100 /*N可以改变*/
void main()
{
int n,p=1;
void jici(int n);
void sioubeishu(int n);
void oubeishu(int n);
void sijibeishu(int n);
void elseoushu(int n);
printf("***说明(本程序用于输出任意数阶次的魔方矩阵,其行,列,对角线之和的均值相同。) ");
printf(" ***说明(最右边的,和最下边的用于统计每行,每列的元素之和 。) ");
printf(" 请输入一个要求阶次的魔方矩阵的边长(2~%d): ",N);
while(p)
{
scanf("%d",&n);
if((n>1)&&(n<=N))
p=0;
}
if(fabs((n-1)%2)<1e-006)
jici(n);
else
if(fabs((n%4))<1e-006)
{
if(n==4) oubeishu(n);
else
if(fabs(n%8)<1e-006)
sioubeishu(n);
else
sijibeishu(n);
}
else
elseoushu(n);
}
void jici(int n)
{
int a[N][N]={0};
int i,j,k,sum;
i=0;
j=(n-1)/2;
a[0][j]=1;
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if((i<0)&&(j>n-1))
{
i=i+2;j=j-1;
}
else
{
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;
j=j-1;
a[i][j]=k;
}
}
sum=0;
for(i=0,j=0;i<n;i++,j++)
{
sum=sum+a[i][j];
}
a[n][n]=sum;
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<n;j++)
sum=sum+a[i][j];
a[i][n]=sum;
}
for(j=0;j<n;j++)
{
sum=0;
for(i=0;i<n;i++)
sum=sum+a[i][j];
a[n][j]=sum;
}
for(i=0;i<n+1;i++)
{
for(j=0;j<n+1;j++)
printf("%5d",a[i][j]);
printf(" ");
}
}
void oubeishu(int n)
{
int a[N][N]={0};
int k,t,i,j,sum;
k=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
a[i][j]=k;
k++;
}
for(i=0,j=0;i<n/2;i++,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
for(i=0,j=n-1;i<n/2;i++,j--)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
sum=0;
for(i=0,j=0;i<n;i++,j++)
{
sum=sum+a[i][j];
}
a[n][n]=sum;
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<n;j++)
sum=sum+a[i][j];
a[i][n]=sum;
}
for(j=0;j<n;j++)
{
sum=0;
for(i=0;i<n;i++)
sum=sum+a[i][j];
a[n][j]=sum;
}
for(i=0;i<n+1;i++)
{
for(j=0;j<n+1;j++)
printf("%5d",a[i][j]);
printf(" ");
}
}
void sioubeishu(int n)
{
int a[N][N]={0};
int k,t,i,j,x,y,sum;
k=1;
for(j=0;j<n;j++)
for(i=0;i<n;i++)
{
a[i][j]=k;
k++;
}
for(x=1;x<=n/8;x++)
for(y=1;y<=n/4;y++)
{
for(i=4*(x-1),j=4*(y-1);i<=4*x-1;i++,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
for(i=4*x-1,j=4*(y-1);i>=4*(x-1);i--,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
}
sum=0;
for(i=0,j=0;i<n;i++,j++)
{
sum=sum+a[i][j];
}
a[n][n]=sum;
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<n;j++)
sum=sum+a[i][j];
a[i][n]=sum;
}
for(j=0;j<n;j++)
{
sum=0;
for(i=0;i<n;i++)
sum=sum+a[i][j];
a[n][j]=sum;
}
for(i=0;i<n+1;i++)
{
for(j=0;j<n+1;j++)
printf("%5d",a[i][j]);
printf(" ");
}
}
void sijibeishu(int n)
{
int a[N][N]={0};
int k,t,i,j,x,y,sum;
k=1;
for(j=0;j<n;j++)
for(i=0;i<n;i++)
{
a[i][j]=k;
k++;
}
for(x=1;x<=(n-4)/8;x++)
for(y=1;y<=n/4;y++)
{
for(i=4*(x-1),j=4*(y-1);i<=4*x-1;i++,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
for(i=4*x-1,j=4*(y-1);i>=4*(x-1);i--,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
}
x=(n+4)/8;
for(y=1;y<(n+4)/8;y++)
{
for(i=4*(x-1),j=4*(y-1);i<=4*x-1;i++,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
for(i=4*x-1,j=4*(y-1);i>=4*(x-1);i--,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
}
y=(n+4)/8;
for(i=4*(x-1),j=4*(y-1);i<=4*x-3;i++,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
for(i=4*x-1,j=4*(y-1);i>=4*x-2;i--,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
sum=0;
for(i=0,j=0;i<n;i++,j++)
{
sum=sum+a[i][j];
}
a[n][n]=sum;
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<n;j++)
sum=sum+a[i][j];
a[i][n]=sum;
}
for(j=0;j<n;j++)
{
sum=0;
for(i=0;i<n;i++)
sum=sum+a[i][j];
a[n][j]=sum;
}
for(i=0;i<n+1;i++)
{
for(j=0;j<n+1;j++)
printf("%5d",a[i][j]);
printf(" ");
}
}
void elseoushu(int n)
{
int a[N][N]={0};
int m,k,i,j,sum,u,t,h;
m=n/2;
i=0;
j=(m-1)/2;
a[0][j]=1;
for(k=2;k<=m*m;k++)
{
i=i-1;
j=j+1;
if((i<0)&&(j>m-1))
{
i=i+2;j=j-1;
}
else
{
if(i<0) i=m-1;
if(j>m-1) j=0;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
i=0;
j=(m-1)/2+m;
a[i][j]=m*m*2+1;
for(k=m*m*2+2;k<=m*3*m;k++)
{
i=i-1;
j=j+1;
if((i<0)&&(j>m*2-1))
{
i=i+2;
j=j-1;
}
else
{
if(i<0) i=m-1;
if(j>m*2-1) j=m;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
i=m;
j=(m-1)/2;
a[i][j]=m*m*3+1;
for(k=m*m*3+2;k<=m*4*m;k++)
{
i=i-1;
j=j+1;
if((i<m)&&(j>m-1))
{
i=i+2;j=j-1;
}
else
{
if(i<m) i=m*2-1;
if(j>m-1) j=0;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
i=m;
j=(m-1)/2+m;
a[i][j]=m*m+1;
for(k=m*m+2;k<=2*m*m;k++)
{
i=i-1;
j=j+1;
if((i<m)&&(j>m-1+m))
{
i=i+2;
j=j-1;
}
else
{
if(i<m) i=m*2-1;
if(j>m*2-1) j=m;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
t=(n+2)/4;u=n/2;
for(j=0;j<t-1;j++)
for(i=0;i<m;i++)
{
h=a[i][j];
a[i][j]=a[i+m][j];
a[i+m][j]=h;
}
for(j=n-t+2;j<n;j++)
for(i=0;i<m;i++)
{
h=a[i][j];
a[i][j]=a[i+m][j];
a[i+m][j]=h;
}
{
h=a[t-1][0];
a[t-1][0]=a[t+u-1][0];
a[t+u-1][0]=h;
}
{
h=a[t-1][t-1];
a[t-1][t-1]=a[t+u-1][t-1];
a[t+u-1][t-1]=h;
}
sum=0;
for(i=0,j=0;i<n;i++,j++)
{
sum=sum+a[i][j];
}
a[n][n]=sum;
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<n;j++)
sum=sum+a[i][j];
a[i][n]=sum;
}
for(j=0;j<n;j++)
{
sum=0;
for(i=0;i<n;i++)
sum=sum+a[i][j];
a[n][j]=sum;
}
for(i=0;i<n+1;i++)
{
for(j=0;j<n+1;j++)
printf("%5d",a[i][j]);
printf(" ");
}
}
这个是我自己编的魔方矩阵的任意数输出程序, 用的是数组方面的内容,比较好理解
C. c语言输出魔方阵程序解释
首先魔方阵是一个奇数行列式方阵,它的一行,一列,对角线的和都相等。
建立魔方阵的第一步是确定1的位置,它是第一行的中间列,之后要确定其他位置的值,
问题1:if((i<1)&&(j>n))时,说明你确定的位置已经超出了魔方阵,所以要用i=i+2;j=j-1;把它拉回的魔方阵内,
问题2:判断第i行地j列的值是否等于0(即是否被填充),如果没填充,就填k,如果填充,再寻找下一个位置,
问题3:因为你的主函数main()前面的返回值为int,所以要提供返回值,那不是return=0,而是return
0;就是返回0,也可以返回1,这没关系的,如果不想要也行,那得把main()前面的int
改为void
.
D. c语言输出魔方阵
先上图:
A
BBB
CCCCC
DDDDDDD
CCCCC
BBB
A
再贴代码:
#include "stdio.h"
#include "conio.h"
main()
{ int i,j;
for(i=1;i<=7;i++)
{
for(j=1;j<=(i<=4?5-i:i-3);j++)
{
printf(" ");
}
for(j=1;j<=2*(i<=4?i:8-i)-1;j++)
{
printf("%c",i<=4?i+64:7-i+65);
}
printf("\n");
}
getch();
}
在写思路:
外层循环控制打印7行东西
里层循环用2个for,一个控制空格个数先递减后递增
一个控制字符从a变为d从d退回a
技巧:A的ascii编码是65。所以我上面的加的数字你分析下就明白了。
楼主好运!
力求最简短的代码给你完成!
E. 输出魔方阵C语言程序
下面运行通过,只不过不知道是否符合你的格式,代码如下:
#include<stdio.h>
voidmain()
{
intnum=-1;
intq=0,t[5];
inta=0,b=0,c=0,d=0,e=0;
inti=0,j=0;
intcount=0,temp=0;
charp;
printf("*********************************************** ");
printf("(1、赵**2、钱**3、孙**4、李**5、周**) ");
while(num!=6)
{
printf("请输入选号:");
scanf("%d",&num);
if(num==0)
q++;
else
switch(num)
{
case1:a++;break;
case2:b++;break;
case3:c++;break;
case4:d++;break;
case5:e++;break;
default:break;
}
}
count=a+b+c+d+e+q;
t[0]=a;
t[1]=b;
t[2]=c;
t[3]=d;
t[4]=e;
printf("hello ");
printf("赵有%d票 钱有%d票 孙有%d票 李有%d票 周有%d票 弃权有%d票 总共有%d人投票(包括弃权的) ",a,b,c,d,e,q,count);
for(i=0;i<5;i++)
for(j=0;j<5-i;j++)
if(t[j]<t[j+1])/*选票排序*/
{
temp=t[j];
t[j]=t[j+1];
t[j+1]=temp;
}
for(i=0;i<3;i++)/*输出前三甲*/
{
if(t[i]==a)
printf("赵是第%d名,共%d票 ",i+1,a);
if(t[i]==b)
printf("钱是第%d名,共%d票 ",i+1,b);
if(t[i]==c)
printf("孙是第%d名,共%d票 ",i+1,c);
if(t[i]==d)
printf("李是第%d名,共%d票 ",i+1,d);
if(t[i]==e)
printf("周是第%d名,共%d票 ",i+1,e);
}
}
运行结果如图:
F. C语言编程,输出魔方阵
程序代码:
#include<stdio.h>
#define N 16
int main()
{
int a[N][N]={0},i,j,k,p,n;
p=1;
while(p==1)
{
printf("Enter n(1~%d):",N);
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(" ");
}
return 0;
}
(6)c语言魔方程序怎么写扩展阅读:
1.第一行中间一列的值为1。
所以用j=n/2+1确定1的列数,得出a[1][j]=1。
2.每一个数存放的行比前一个数的行数减1,列数加1。
行数用i=i-1确定,列数用j=j+1确定。
3.如果一个数行数为第一行,则下一个数行数为最后一行。
4.如果一个列行数为最后一列,则下一个数列数为第一列。
5.如果按上面的规则确定的位置上已有数,或上一个数是第一行最后一列,则把下一个数放在上一个数的下面。
G. n阶魔方阵C语言
据我所知,起码,n为偶数时n阶魔方阵是很难得到的,你的是不是奇数的魔方阵?