浙大版C语言题目集7-2(到8)

文章介绍了几个编程题目,涉及矩阵的行元素和局部极大值计算、日期判断、上三角矩阵识别、杨辉三角生成、元素循环移位以及寻找鞍点等技术,展示了C语言的基本操作和算法应用。
摘要由CSDN通过智能技术生成

7-2-1

本题要求编写程序,求一个给定的m×n矩阵各行元素之和。

输入格式:

输入第一行给出两个正整数m和n(1≤m,n≤6)。随后m行,每行给出n个整数,其间

以空格分隔。

输出格式:

每行输出对应矩阵行元素之和。

#include <stdio.h>

int main()
{
	int m,n,i=0,j=0,sum=0;
	scanf("%d %d",&m,&n);
	int a[m][n],b[6]={0};
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			scanf("%d",&a[i][j]);
			b[i]+=a[i][j];
		}
	}
	for(i=0;i<m;i++){
		printf("%d\n",b[i]);
	}
    return 0;
}

7-2-2

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

输入格式:

输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

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

副对角线i+j=n-1

#include <stdio.h>

int main()
{
	int n,sum=0,i,j;
	scanf("%d",&n);
	int a[n][n];
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			scanf("%d",&a[i][j]);
			if (!( i==(n-1) || j==(n-1) || (i+j)==(n-1) )) {
				sum+=a[i][j];
			}
		}
	}
	printf("%d",sum);
    return 0;
}

7-2-3

给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。

输入格式:

输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。

输出格式:

每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。

题目给的样例我感觉是错的(大概?),这个矩阵没有局部极大值。

从第二行第二列开始循环,有局部极大值k+1,k=0表示没有局部极大值。

#include <stdio.h>

int main()
{
	int m,n,i,j,k=0;
	scanf("%d %d",&m,&n);
	int a[m][n];
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	for(i=1;i<(m-1);i++){
		for(j=1;j<(n-1);j++){
			if (a[i][j]>(a[i-1][j]+a[i][j-1]+a[i][j+1]+a[i+1][j])) {
				printf("%d %d %d",a[i][j],i+1,j+1);
				k++;
			}
		}
	}
	if(k==0) printf("None %d %d",m,n);
    return 0;
}

7-2-4

本题要求编写程序计算某年某月某日是该年中的第几天。

输入格式:

输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。

输出格式:

在一行输出日期是该年中的第几天。

#include <stdio.h>

int main()
{
	int y,m,d,a[12]={31,28,31,30,31,30,31,31,30,31,30,31},i=0,day=0;
	scanf("%d/%d/%d",&y,&m,&d);
	for(;i<m-1;i++){
		day+=a[i];
	}
	day+=d;
	if ( m>2 && ((y%4==0 && y%100!=0) || y%400==0)) {
		day+=1;
	}
	printf("%d",day);
    return 0;
}

7-2-5

上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。

本题要求编写程序,判断一个给定的方阵是否上三角矩阵。

输入格式:

输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。

t为待测矩阵个数。

左下角有一个非0的数就可以跳出循环,该矩阵flag=1不是三角矩阵。

将判断结果反向存到b[t]中,最后一起反向输出。不知道怎么把“YES”、“NO”存到数组里面,就用0、1判断了。

sizeof(b)/sizeof(b[0])为b[t]中数字的个数(其实就是t,只是前面t--减没了,又不想再多个变量。前面反向存也是不想多个变量,不知道咋处理好)。

#include <stdio.h>

int main()
{
	int t,n,i,j;
	scanf("%d",&t);
	int b[t];
	while(t>=1){
		scanf("%d",&n);
		int a[n][n],flag=0;
		for(i=0;i<n;i++){
			for(j=0;j<n;j++){
				scanf("%d",&a[i][j]);
			}
		}
		for(i=1;i<n;i++){
			for(j=0;j<i;j++){
				if (a[i][j]!=0) {
					flag=1;
					i=n;
					break;
				}
			}
		}
		if (flag==0){
			b[t-1]=0;
		}else {
			b[t-1]=1;
		}
		t--;
	}
	for (i=sizeof(b)/sizeof(b[0])-1;i>=0;i--){
		if(b[i]==1){
			printf("NO\n");
		}else {
			printf("YES\n");
		}
	}
	return 0;
}

7-2-6

本题要求按照规定格式打印前N行杨辉三角。

输入格式:

输入在一行中给出N(1≤N≤10)。

输出格式:

以正三角形的格式输出前N行杨辉三角。每个数字占固定4位。

输入样例:

6

输出样例:

        1
       1   1
      1   2   1
     1   3   3   1
    1   4   6   4   1
   1   5  10  10   5   1

先不管前面的空格,做一个只有左下角有值的矩阵。j=0和j=i的值为1,其他值a[i][j]=a[i-1][j-1]+a[i-1][j]。

在输出矩阵每一行的数字前输出空格,空格数k=n-1-i。

每个数字占固定4位,用%4d输出。每一行输出结束后回车。

#include <stdio.h>

int main()
{
	int n;
	scanf("%d",&n);
	int a[n][n],i,j,k;
	for(i=0;i<n;i++){
		for(j=0;j<=i;j++){
			if(j==0 || j==i) {
				a[i][j]=1;
			}else {
				a[i][j]=a[i-1][j-1]+a[i-1][j];
			}
		}
	}
	for(i=0;i<n;i++){
		for(k=(n-1)-i;k>0;k--){
			printf(" ");
		}
		for(j=0;j<=i;j++){
			printf("%4d",a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

7-2-7

本题要求编写程序,将给定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个整数,每个整数后输出一个空格。

b[n][n]为a[n][n]每一行向右移m位的结果。

如果列数j+m<n,右移m位后列数为j+m。如果列数j+m>=n,右移m位后列数为j+m-n。

#include <stdio.h>

int main()
{
	int n,m,i,j,k=0;
	scanf("%d %d",&m,&n);
	int a[n][n],b[n][n];
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			if(j+m<n){
				b[i][j+m]=a[i][j];
			}else {
				b[i][j+m-n]=a[i][j];
			}
		}
	}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			printf("%d ",b[i][j]);
		}
		printf("\n");
	}
	return 0;
}

7-2-8

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点。

输入格式:

输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

先找该行最大数,有最大数f1=1,最大数为a[b][c]=m。没有(最大有2个及以上的数)f1=0找下一行。

再与其列数字对比,a[l][c]与a[b][c]对比,有一个数小于等于a[b][c],该数就不是鞍点,f2=0找下一行。循环完没有找到比a[b][c]小的数,该数为最小数,f2=1。

f2=1,输出下标b、c,k为鞍点计数+1。k=0输出NONE。

#include <stdio.h>

int main()
{
	//k为鞍点的计数,m为该行最大数,b、c为最大数下标
	//f1=1代表该数为该行最大数(去掉相等的情况) 
	//f2=1代表该数为该列最小数(去掉相等的情况) 
	int n,i,j,k=0,m,b=0,c=0,l,f1,f2;
	scanf("%d",&n);
	int a[n][n];
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	for(i=0;i<n;i++){
		m=a[i][0];
		f1=1;
		f2=1;
		//找出该行最大数m及下标b、c,去掉相等的情况
		for(j=1;j<n;j++){
			if(a[i][j]>m){
				m=a[i][j];
				b=i;
				c=j;
				f1=1;
			}else if(a[i][j]==m){
				f1=0;
			}
		}
		if(f1==1) {
			//对比该行最大数与其列数字,去掉相等的情况
			for(l=0;l<n;l++){
				if(l==b) continue;
				if( a[l][c]<=a[b][c] ){
					f2=0;
					break;
				}	
			}
			//输出鞍点行、列下标,k为鞍点的计数 
			if(f2==1){
				printf("%d %d\n",b,c);
				k++;
			}
		} 		
	}
	//k=0没有鞍点,输出NONE
	if(k==0) printf("NONE");
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值