用C语言编写程序
在下面的5×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 |
追问:我把那些数字输进去之后,没有出现矩阵!是怎么回事呀?
在下面的5×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>void main()
{
int n;
int a[100][100];
long i,j,k,sum;
int flag;
scanf("%d",&n);
sum=0;
for(i=0;i<n;i++){scanf("%d",&a[0][i]);sum+=a[0][i];}
flag=1;
for (i=1;i<n;i++)
{ k=0;
for(j=0;j<n;j++)
{scanf("%d",&a[i][j]);k+=a[0][i];
}
if (k!=sum)
{flag=0;
}
}
if(flag) printf("yes\n");else printf("no\n");
for (i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
#include "stdio.h"
void main()
{
int i,j,sum;
int s,flag=1;
int a[5][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}};
sum=0;
for(j=0;j<5;j++)
{
sum=sum+a[0][j];
}
s=sum;//第一行的和
//判断各行的和是否相等
for(i=0;i<5;i++)
{
sum=0;
for(j=0;j<5;j++)
{
sum=sum+a[i][j];
}
if(sum!=s)
{
flag=0;
break;
}
}
if(flag==1)//如果各行的和相等,继续判断各列是否相等
{
//判断各列的和是否相等
for(j=0;j<5;j++)
{
sum=0;
for(i=0;i<5;i++)
{
sum=sum+a[i][j];
}
if(sum!=s)
{
flag=0;
break;
}
}
}
if(flag==1)//如果各行的和、各列的和均相等,继续判断对角线上的元素的和是否相等
{
sum=0;
//判断对角线上的元素的和是否和前面的和相等
for(i=0;i<5;i++)
{
sum=sum+a[i][i];
}
if(sum!=s)
{
flag=0;
}
}
//如果各行的和、各列的和、对角线上的元素的和均相等,继续判断副对角线上的元素的和是否相等
if(flag==1)
{
sum=0;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if((i+j)==4)
{
sum=sum+a[i][j];
}
}
}
if(sum!=s)
{
flag=0;
}
}
printf("矩阵:\n");
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
printf("%4d",a[i][j]);
}
printf("\n");
}
if(flag==1)
{
printf("是魔方矩阵\n");
}
else
{
printf("不是魔方矩阵!");
}}
运行截图:
你的意思是怎样给C程序加一个程序界面,就像windows窗口一样?
建议在VC++6.0下运行,VC++不是语言,他只是一个集成开发环境(也叫IDE)
他提供控件让我们可以把程序作成窗口的模式
也就是你说的那样首先要知道什么事魔方阵 有是小时后玩的游戏 一个3*3的矩阵要求 行加起来 =列加起来 =对角线加起来 就是这个规则了
排法有很多种 我的是 先将 ‘1’排到第一行的中间一列
然后排 2-n*n 个数了排法就是 右上角法 就是
先判断前一个数是不是 N阶矩阵的倍数 比如是 3阶矩阵 就判断 前一个数不是3的倍数
如果是咱就把它的 “列不变行加1" 就是放到前一个数的下面
然后判断这个数的行是不是第一行 如果是就 把这个数的行变成3列同样加1 (i=3 k++)
否则判断这个数的列是不是最后一行如果是就把这个数的列变成1行同样减1 (k=1 i--)
整完这些之后判断当前这个数的位置上到底有没有数 如果有的话就放到前一个数的下面 这里因为开始判断的时候 行和列都已经改变了所以要( i+2 k-1)如果没有数的话就可以放上去了 具体的代码如下
#include<stdio.h>#define N 5 //最佳显示出15阶void main(){ int a[N][N]={0},i,k,n;i=0;//第一行k=(N+1)/2-1;//中间的一个a[i][k]=1;//第一行中间一列等于1for(n=2;n<=N*N;n++)//从2 开始排{ if((n-1)%N==0) //如果前一个数是这个数的倍数则 列不变行加1 i++; else if(i==0) //如果一个数的行为0 则行为3列加一 { i=N-1; k++;} else if(k==N-1)//如果列为3 则列为0 行-1 { k=0; i--; } else { i--; k++;} //这里是判断能否输出 if(a[i][k]==0)//该元素为0,继续执行程序 a[i][k]=n;else //如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面 { i=i+2; //因为此时的i在上面已经变到了最上面去了所以要向下移动比如4在3下面 k=k-1;a[i][k]=n; }} //输出矩阵for(i=0;i<N;i++) { for(k=0;k<N;k++) printf("%4d",a[i][k]); printf("\n");}}
修改N就可以输出3~17阶中的奇数阶
上一个:c语言问题(编程问题)
下一个:C语言 可变参数列表