第5关:幻方
幻方(
Magic Square
)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。 幻方也是一种中国传统游戏。旧时在官府、学堂多见。它是将从一到若干个连续的自然数排成纵横各为若干个数的正方形,使在同一行、同一列和同一对角线上的几个数的和都相等。例如有如下表所示的一个三阶幻方,幻和为
15
。
4 |
9 |
2 |
---|---|---|
3 |
5 |
7 |
8 |
1 |
6 |
本关任务:编写程序判定
N×N
(规定
N
为奇数,且
N<20
)的矩阵是否是”幻方”,(
N×N
的二维数组各元素的值由用户在程序运行时输入) “幻方”的判定条件是:矩阵每行、每列、主对角线及反对角线上元素之和都相等。
输入: 第一行为一个整数,代表矩阵维数
N
。 第二行开始为矩阵输入数据。
输出: 判断结果,若是幻方则输出
Yes
不是则输出
No
。
测试输入:
3
4 9 2
3 5 7
8 1 6
预期输出:
Yes
#include <stdio.h>
#include <string.h>
int main()
{
int N;
scanf("%d",&N);
int a[N][N];
//输入二维数组
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
scanf("%d",&a[i][j]);
}
}
//判断是否是幻方
int sum1[100]={0};//注意不能写成sum1[N];数组长度不能是变量
int sum2[100]={0};
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
sum1[i]= sum1[i]+a[i][j];//求第i行数据之和
}
//printf("---%d----\n",sum1[i]);
}
//求第j列数据之和
for(int j=0;j<N;j++){
for(int i=0;i<N;i++){
sum2[j]= sum2[j]+a[i][j];//求第j列数据之和
}
//printf("***%d**\n",sum2[j]);
}
//求主对角线之和和反对角线之和
int sum3=0,sum4=0;
for(int i=0;i<N;i++){
sum3=sum3+a[i][i];
sum4=sum4+a[i][N-i-1];
}
//判断是否行的和等于列的和等于两条对角线之和
for(int i=0;i<N;i++){
//printf("%d,%d,%d,%d\n",sum1[i],sum2[i],sum3,sum4);
if(sum1[i]==sum2[i]&&sum1[i]==sum3&&sum3==sum4){
printf("Yes");
break;
}else{
printf("No");
break;
}
}
//输出二维数组
/*for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}*/
return 0;
}
第4关:数组元素交换
本关任务:有一个
3*4
矩阵,找出每行中最大的元素并与第
1
列元素交换。
具体要求如下:
1.
使用二维数组存放该
3*4
矩阵
2.
为二维数组输入数据。
3.
输出原矩阵并和处理后的矩阵进行比较。
输入:
第一行为两个整数,表示
3x4
的矩阵。 第二行开始为矩阵赋值。
输出:
第一行输出提示”原矩阵:”。
第二行开始输出原矩阵数据。
接下来一行输出提示”处理后:”。
接下来一行开始输出处理后的矩阵数据。
平台会对你编写的代码进行测试:
测试输入:
3 4
1 2 3 4
5 6 7 8
9 10 11 12
预期输出:
原矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
处理后:
4 2 3 1
8 6 7 5
1
2 10 11 9
#include <stdio.h>
#include <string.h>
int main()
{
int M,N,k=0;
char b[100];
scanf("%d %d",&M,&N);
int a[M][N];
//输入二维数组
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
scanf("%d",&a[i][j]);
}
}
//输出原来的二维数组
printf("原矩阵:\n");
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
//处理,找到每行中最大元素
int t;
for(int i=0;i<M;i++){
int max=a[i][0],row=i,col=0;
for(int j=0;j<N;j++){
if(max<=a[i][j]){
max=a[i][j];
col=j;
}
}
//与第一列元素交换
t=a[i][0];
a[i][0]=a[i][col];
a[i][col]=t;
}
//输出处理后的二维数组
printf("处理后:\n");
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
第3关:二维数组的展开
本关任务:
编写程序,功能是将
M
行
N
列的二维数组中的字符数据按列的顺序依次放到一个字符串(一维数组)中。
例如,二维数组中的数据为:
SSSS
YYYY
XXXX
YYYY
则字符串中的内容应是:
SYXYSYXYSYXYSYXY
。
输入:
第一行为两个整数
M
和
N
代表数组
M
行
N
列大小。
第二行开始为输入的二维数组数据。
输出:
处理后输出的一维数组。
测试输入:
4 4
SSSS
YYYY
XXXX
YYYY
预期输出:
SYXYSYXYSYXYSYXY
#include <stdio.h>
#include <string.h>
int main()
{
int M,N,k=0;
char b[100];
scanf("%d %d",&M,&N);
char a[M][N];
for(int i=0;i<M;i++){
scanf("%s",&a[i]);
}
//输出二维数组
/*for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
printf("%c",a[i][j]);
}
printf("\n");
}*/
for(int j=0;j<N;j++){
for(int i=0;i<M;i++){
b[k]=a[i][j];
k++;
}
}
for(int i=0;i<k;i++){
printf("%c",b[i]);
}
return 0;
}
第2关:二位数组操作
#include <stdio.h>
int main()
{
int N;
scanf("%d",&N);
int a[N][N];
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<N;i++){
for(int j=0;j<=i;j++){
a[i][j]=0;
}
}
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
第1关:折半查找
本关任务:由
N
个有序整数组成的数列已放在一维数组中,给定程序的功能是:利用折半查找法查找整数
m
在数组中的位置。若找到,返回其下标值,否则返回
-1
。
#include <stdio.h>
#define N 10
int main()
{
int i, a[N]={-5,4,9,15,28,45,66,89,100,180 }, k=-1, m;
int low=0, high=N-1, mid;
for(i=0;i<N;i++)
printf("%d ", a[i]);
printf("\n");
scanf("%d",&m);
while(low <= high)
{
mid = (low + high) / 2;
if(m < a[mid])
high = mid-1;
/***** 以下一行有错误 *****/
else if(m > a[mid]) low=mid+1;
/***** 以下一行有错误 *****/
else {k=mid;break;}
}
if(k>=0)
printf("m=%d,index=%d\n",m,k);
else
printf("Not be found!\n");
return 0;
}