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;
}