本文目录一览:
- 1、c语言幻方
- 2、c语言题目,输入一个N*N的矩阵,判断该矩阵是否为幻方矩阵,跪求,跪求,脑已残
- 3、怎样用C语言编写幻方
- 4、求幻方的C语言算法!
- 5、C语言编程幻方输入问题
- 6、用C语言编一个简单的程序来判断N×N的矩阵是否为一个幻方。
c语言幻方
1.每个自然数只出现一次,没有考虑
2.数组下标从0开始
3.
for(i=1;i=n;i++)
{
for(j=1;j=n;j++)
{
if(j==i) s1=s1+a[i][j];
if(i+j==n+1) s2=s2+a[i][j];
}
}
这样没必要
for(i=0;in;i++)
{
s1+=a[i][i];
s2+=a[i][n-1-i];
}
c语言题目,输入一个N*N的矩阵,判断该矩阵是否为幻方矩阵,跪求,跪求,脑已残
#include stdio.h
#include stdlib.h
int main()
{
int n,i,k,p;
long sn0,sn1,sn2,sn3,sn4;
printf("Input n:");
scanf("%d",n);
int m[n][n];
for(i=0;in;++i){
for(k=0;kn;++k){
printf("Input M[%d,%d]:",i,k);
scanf("%d",m[i][k]);
}
}
sn0=0;sn1=0;sn2=0;sn3=0;sn4=0;
for(i=0;in;++i){
sn0+=m[0][i];
}
p=1;
printf("%ld\n",sn0);
for(i=0;in;++i){
sn1=0;
sn2=0;
for(k=0;kn;++k){
sn1+=m[i][k];
sn2+=m[k][i];
}
if(sn1!=sn0 || sn2!=sn0){
p=0;
break;
}
sn3+=m[i][i];
sn4+=m[i][n-i-1];
}
if(sn3 != sn0 || sn4!=sn0)
p=0;
if(p==1){
printf("Yes!\n");
}else{
printf("No!\n");
}
return 0;
}
怎样用C语言编写幻方
你的这个问题实际上包括两个问题:
1、幻方的算法
2、怎样用C语言实现幻方的算法
这两个问题是大不同的。
关于幻方的算法,或者叫幻方填法,目前有很多种,拉丁正交、马步法等等,针对奇数或者偶数(又分单偶数和双偶数)等有不同的算法,但这些算法只是帮你找到幻方的一个或多个实例(不会是全部),而同阶数的幻方到底有多少个,那只有用穷举法了,比如4阶幻方,基本4阶幻方共7040个,剔除旋转翻转的,即具有独立结构的共880个;4阶完美幻方共84个,具有独立结构的共48个。
对于高阶幻方(比如超过8阶),穷举法实际上是不可行的,因为它的穷举时间将是天文数字(以目前主流PC),所以不要试图用计算机穷举高阶幻方的全部结果,那将是徒劳的。
如果你只是需要1个实例,那么推荐你使用MATLAB语言工具,因为它提供了幻方函数magic(n),不需要编程,直接从命令窗口输入就可以得到答案。
至于第二个问题,当然你首先会C语言,剩下的就是编程技巧问题了,而这个问题是无从回答的。相信你问的是第一个问题。
以上的回答虽然没有明确给出答案,但相信对你会有帮助。
求幻方的C语言算法!
你先看看吧:
3阶幻方:
8 1 6
3 5 7
4 9 2
5阶幻方:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
#include stdio.h
#define N 5
void main()
{
int i,j,k,a[N][N];
for(i=0;iN;i++)
for(j=0;jN;j++)
a[i][j]=0; /*初始值为零*/
j=N/2;
a[0][j]=1; /*确定1的位置*/
for(k=2;k=N*N;k++)
{
i--;
j++;
if(i0)
i=N-1; /*行出界*/
else if(jN-1)
j=0; /*列出界*/
if(a[i][j]==0)
a[i][j]=k; /*按规律顺序确定数值位置*/
else
{
i=(i+2)%N;
j=(j-1+N)%N;
a[i][j]=k; /*已有数字时数字的位置*/
}
}
printf("\n\n");
for(i=0;iN;i++)
{
printf("\t");
for(j=0;jN;j++)
printf("%4d",a[i][j]); /*显示幻方阵*/
printf("\n\n");
}
return;
}
最好是自己研究下 ,印象比较深刻。
好好学习呀 其实我也只是个初学者
C语言编程幻方输入问题
#include stdio.h
#define N 3
int fun(int (*a)[N])
{ int i,j,m1,m2,row,colum;
m1=m2=0;
%判断对角线的和不否相等 不相等返回0
for(i=0; iN; i++)
{ j=N-i-1; m1+=a[i][i]; m2+=a[i][j]; }
if(m1!=m2) return 0;
for(i=0; iN; i++) {
/**********found**********/
row=colum=0;
%判断行row 列colum的和 是否相等 不相等返回0
for(j=0; jN; j++)
{ row+=a[i][j]; colum+=a[j][i]; }
/**********found**********/
if( (row!=colum) || (row!=m1) ) return 0;
}
/**********found**********/
%判断完毕是幻方返回1
return 1;
}
main()
{ int x[N][N],i,j;
%输入矩阵x
printf("Enter number for array:\n");
for(i=0; iN; i++)
for(j=0; jN; j++) scanf("%d",x[i][j]);
printf("Array:\n");
%输出矩阵
for(i=0; iN; i++)
{ for(j=0; jN; j++) printf("%3d",x[i][j]);
printf("\n");
}
%根据fun的值输出结果
if(fun(x)) printf("The Array is a magic square.\n");
else printf("The Array isn't a magic square.\n");
}
你要是符合C规则的矩阵输入方法否可以啊??? 你看输出矩阵那块 输出的矩阵跟你输入的是不是一样啊 要是一样 结果都是对的 一般的就是 列之间用空格 行之间用回车 这段程序的重点是为什么把 判断对角线写在前面吧????要是顺序反了 判断是不全面的
用C语言编一个简单的程序来判断N×N的矩阵是否为一个幻方。
#include"stdio.h"
#include"math.h"
int a[256][256];
int sum;
int check();
void ins(int n);
void main(){
int i,j,n,k,t,p,x;
scanf("%d",n);
sum=(n*n+1)*n/2;
if(n%2==1) //奇数幻方
ins(n);
if(n%4==2) { //单偶数幻方
k=n/2;
ins(k);
for(i=0; ik; i++)
for(j=0; jk; j++){
a[i][j+k]=a[i][j]+2*k*k;
a[i+k][j]=a[i][j]+3*k*k;
a[i+k][j+k]=a[i][j]+k*k;
}
t=(n-2)/4;
for(i=0; ik; i++)
for(j=0; jk; j++){
if((jt)(it)){
p=a[i][j];
a[i][j]=a[i+k][j];
a[i+k][j]=p;
}if((jt)(ik-t-1)){
p=a[i][j];
a[i][j]=a[i+k][j];
a[i+k][j]=p;
}if((i=ti=k-t-1)(j=tjt*2)){
p=a[i][j];
a[i][j]=a[i+k][j];
a[i+k][j]=p;
}if(j1j=t){
p=a[i][j+k];
a[i][j+k]=a[i+k][j+k];
a[i+k][j+k]=p;
}
}
}
if(n%4==0) { //双偶数幻方
x=1;
for(i=0; in; i++)
for(j=0; jn; j++)
a[i][j]=x++;
for(i=0; in; i++)
for(j=0; jn; j++){
if(i%4==0abs(i-j)%4==0)
for(k=0; k4; k++)
a[i+k][j+k]=n*n-a[i+k][j+k]+1;
else if(i%4==3(i+j)%4==3)
for(k=0; k4; k++)
a[i-k][j+k]=n*n-a[i-k][j+k]+1;
}
}
if(check(n)==1){
for(i=0; in; i++){
for(j=0; jn; j++)
printf("%5d",a[i][j]);
printf("\n");
}
}
}
int check(int n) { //检验是否是幻方
int i,j,sum1=0,sum2;
for(i=0; in; i++){
for(j=0; jn; j++)
sum1+=a[i][j];
if(sum1!=sum)
return 0;
sum1=0;
}
for(i=0; in; i++){
for(j=0; jn; j++)
sum1+=a[i][j];
if(sum1!=sum)
return 0;
sum1=0;
}
for(sum1=0,sum2=0,i=0,j=0; in; i++,j++){
sum1+=a[i][j];
sum2+=a[i][n-j-1];
}
if(sum1!=sum)
return 0;
if(sum2!=sum)
return 0;
else
return 1;
}
void ins(int n) { //单偶数幻方的输入
int x,y,m;
x=0;
y=n/2;
for(m=1; m=n*n; m++){
a[x][y]=m;
if(m%n!=0){
x--;
y++;
if(x0)x=x+n;
if(y==n)y=n-y;
}else{
x++;
if(x==n)x=x-n;
}
}
}
// c++语言实现
//(1)求奇数幻方
#includeiostream.h
#includeiomanip.h
int main(){
int n,x,y,tot=0,i,j,a[100][100]={0};
cout"请输入一个奇数"endl;
cinn;
a[i=n/2][j=0]=++tot;
i--;
j--;
while(tot=n*n){
i0?i=n-1:i=i;
j0?j=n-1:j=j;
if(a[i][j]){
i=x;
j=y+1;
}
a[i][j]=++tot;
x=i;
y=j;
i--;
j--;
}
for(i=0; in; i++){
for(j=0; jn; j++)
coutsetw(3)a[i][j];
coutendl;
}
return 0;
}
//(2)求单偶幻方
#includeiostream.h
#includeiomanip.h
int main(){
int n,i=0,j=0,a[100][100],tot=0;
cout"请输入4的倍数"endl;
cinn;
for(i=0; in; i++)
for(j=0; jn; j++){
a[i][j]=++tot;
}
for(i=0; in; i++){
for(j=0; jn; j++){
if(i%4==j%4||i%4+j%4==3)
a[i][j]=n*n+1-a[i][j];
}
}
for(i=0; in; i++){
for(j=0; jn; j++){
coutsetw(4)a[i][j];
}
coutendl;
}
return 0;
}