【C/PTA】数组进阶练习(一)

本文结合PTA专项练习带领读者掌握数组,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。

目录

    • [7-1 矩阵运算](#7-1 矩阵运算)
    • [7-2 方阵循环右移](#7-2 方阵循环右移)
    • [7-3 螺旋方阵](#7-3 螺旋方阵)
    • [7-4 数组-杨辉三角](#7-4 数组-杨辉三角)
    • [7-5 数组-对角线求和](#7-5 数组-对角线求和)
    • [7-6 数组-矩阵最小值](#7-6 数组-矩阵最小值)

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

c 复制代码
#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

c 复制代码
#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

c 复制代码
#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
c 复制代码
#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

c 复制代码
#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

c 复制代码
#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);
}
相关推荐
一直学习永不止步几秒前
LeetCode题练习与总结:赎金信--383
java·数据结构·算法·leetcode·字符串·哈希表·计数
小刘|32 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
jjyangyou36 分钟前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
xinghuitunan1 小时前
蓝桥杯顺子日期(填空题)
c语言·蓝桥杯
van叶~1 小时前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法
Half-up1 小时前
C语言心型代码解析
c语言·开发语言
简简单单做算法1 小时前
基于Retinex算法的图像去雾matlab仿真
算法·matlab·图像去雾·retinex
云卓SKYDROID1 小时前
除草机器人算法以及技术详解!
算法·机器人·科普·高科技·云卓科技·算法技术
懒大王就是我1 小时前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
半盏茶香2 小时前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏