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


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

    7-1 矩阵运算

    给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。
    输入格式:

    输入第一行给出正整数n(1 输出格式:

    在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。
    输入样例:

    4
    2 3 4 1
    5 6 1 1
    7 1 8 1
    1 1 1 1

    输出样例:

    35

    #include 
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    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 
    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");
    		}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    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 
    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");
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    7-4 数组-杨辉三角

    输入一个正整数N,输出杨辉三角的前N行。
    输入格式:

    输入一个正整数N(N<=20)。
    输出格式:

    输出杨辉三角的前N行,每个数的宽度为7,如果数据的位数小于7,则左端补以空格,行末没有空格。
    输入样例:

    4

    输出样例:

      1
      1      1
      1      2      1
      1      3      3      1
    
    • 1
    • 2
    • 3
    • 4
    #include 
    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");		
    	}
    	
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    7-5 数组-对角线求和

    求一个N*N的整型矩阵的正对角线和反对角线元素之和。
    输入格式:

    第一行输入一个正整数N(N<=100);

    接下来输入N行,每行N个整数(均满足int范围)。
    输出格式:

    输出仅一行,包括两个以空格分隔的正整数,分别表示矩阵的正对角线元素之和,反对角线元素之和。
    输入样例:

    3
    2 4 3
    1 3 5
    4 1 3

    输出样例:

    8 10

    #include 
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    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 
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    【DP】Block Sequence—CF1881E
    关于反逻辑负负得正arr
    基于SSH的网上购书系统设计与实现
    如何制作传统节日网站(纯HTML代码)
    QUIC 协议:特性、应用场景及其对物联网/车联网的影响
    深入浅出ThreadPoolExecutor(一)
    基于UiAutomator2+PageObject模式开展APP自动化测试实战
    c#设计模式-创建型模式 之 建造者模式
    ThreadLocal
    东华大学 2022 oj c++ 无超纲写法 素数表
  • 原文地址:https://blog.csdn.net/2301_77485708/article/details/134442033