本文结合PTA专项练习带领读者掌握数组,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。
7-1 矩阵运算
给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。
输入格式:
输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。
输入样例:
4
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1
输出样例:
35
#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]); } } int sum=0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { sum+=a[i][j]; if(i+j==n-1||i==n-1||j==n-1) { sum-=a[i][j]; } } } printf("%d",sum); }
7-2 方阵循环右移
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。
输入格式:
输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。
输出格式:
按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。
输入样例:
2 3
1 2 3
4 5 6
7 8 9
输出样例:
2 3 1
5 6 4
8 9 7
#include <stdio.h> int main() { int m,n;scanf("%d %d",&m,&n); int a[n][n],b[n][n]; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { scanf("%d",&a[i][j]); b[i][j]=a[i][j]; } } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) {//使用两个数组,因为单个数组实现不了元素的循环 b[i][(j+m)%n]=a[i][j]; } } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { printf("%d ",b[i][j]); } printf("\n"); } }
7-3 螺旋方阵
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
输入格式:
输入在一行中给出一个正整数N(<10)。
输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。
输入样例:
5
输出样例:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
#include <stdio.h> int main() { int n;scanf("%d",&n); int a[n][n]; int t=1;//最开始填入的数字位1 此后自增 int startrow=0,endrow=n-1,startcol=0,endcol=n-1;//表示行列 while(t<=n*n) { //第一行从左至右 for(int j=startcol;j<=endcol;j++) { a[startrow][j]=t++; } startrow++; //最后一列从上到下 for(int i=startrow;i<=endrow;i++) { a[i][endcol]=t++; } endcol--; //最后一行从右到左 for(int j=endcol;j>=startcol;j--) { a[endrow][j]=t++; } endrow--; //第一列从下到上 for(int i=endrow;i>=startrow;i--) { a[i][startcol]=t++; } startcol++; //由此开始新的螺旋方阵 } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { printf("%3d",a[i][j]); } printf("\n"); } }
7-4 数组-杨辉三角
输入一个正整数N,输出杨辉三角的前N行。
输入格式:
输入一个正整数N(N<=20)。
输出格式:
输出杨辉三角的前N行,每个数的宽度为7,如果数据的位数小于7,则左端补以空格,行末没有空格。
输入样例:
4
输出样例:
1 1 1 1 2 1 1 3 3 1
#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<=i;j++) { if(j==0||j==i) { a[i][j]=1; } else a[i][j]=a[i-1][j]+a[i-1][j-1]; } } for(int i=0;i<n;i++) { for(int j=0;j<=i;j++) { printf("%7d",a[i][j]); } printf("\n"); } }
7-5 数组-对角线求和
求一个N*N的整型矩阵的正对角线和反对角线元素之和。
输入格式:
第一行输入一个正整数N(N<=100);
接下来输入N行,每行N个整数(均满足int范围)。
输出格式:
输出仅一行,包括两个以空格分隔的正整数,分别表示矩阵的正对角线元素之和,反对角线元素之和。
输入样例:
3
2 4 3
1 3 5
4 1 3
输出样例:
8 10
#include <stdio.h> int main() { int n;scanf("%d",&n);int a[n][n]; int all=0,sum=0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { scanf("%d",&a[i][j]); if(i+j==n-1) all+=a[i][j]; if(i==j) sum+=a[i][j]; } } printf("%d %d",sum,all); }
7-6 数组-矩阵最小值
给定一个大小为M*N的矩阵,请你求出该矩阵的最小值及其坐标。
输入格式:
第一行输入两个整数M,N(3 <= M,N <= 20);
接下来M行,每行N个整数,即该矩阵的元素。每行两个整数间以空格分隔。
输出格式:
输出仅一行,包含三个整数。第一个整数表示矩阵的最小元素的值,第二个和第三个整数分别表示该元素所在的行号和列号。
数据保证最小值存在且唯一。行号列号分别从1开始计数。
两个数之间用一个空格符隔开,行末没有多余的空格。
输入样例:
3 3
1 2 3
1 -2 4
1 2 3
输出样例:
-2 2 2
#include <stdio.h> int main() { int m,n;scanf("%d%d",&m,&n);int a[m][n]; int min,b,c; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { scanf("%d",&a[i][j]); } } min=a[0][0]; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(a[i][j]<min) { min=a[i][j]; b=i,c=j; } } } printf("%d %d %d",min,b+1,c+1); }