7-1 sdut-C语言实验-求一个3*3矩阵对角线元素之和
分数 12
作者 马新娟
单位 山东理工大学
给定一个33的矩阵,请你求出对角线元素之和。
输入格式:
按照行优先顺序输入一个33矩阵,每个矩阵元素均为整数。
输出格式:
从左下角到右上角这条对角线上的元素之和。
输入样例:
1 2 3
3 4 5
6 0 1
输出样例:
在这里给出相应的输出。例如:
13
#include<stdio.h>
int main()
{
int i,j,sum=0;
int a[3][3];
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
scanf("%d", &a[i][j]);
}
}
for(i=0,j=2;i<3;i++,j--)
{
sum=sum+a[i][j];
}
printf("%d",sum);
return 0;
}
7-2 求矩阵各行元素之和
分数 15
作者 C课程组
单位 浙江大学
本题要求编写程序,求一个给定的m×n矩阵各行元素之和。
输入格式:
输入第一行给出两个正整数m和n(1≤m,n≤6)。随后m行,每行给出n个整数,其间
以空格分隔。
输出格式:
每行输出对应矩阵行元素之和。
输入样例:
3 2
6 3
1 -8
3 12
输出样例:
9
-7
15
#include<stdio.h>
int main(){
int m,n,i,j,c;
scanf("%d %d",&m,&n);
int a[m][n];
for(i=0;i<m;i++){
c=0;
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
c+=a[i][j];
}
printf("%d\n",c);
}
return 0;
}
7-3 sdut-C语言实验- 对称矩阵的判定
分数 13
作者 马新娟
单位 山东理工大学
输入矩阵的行数,再依次输入矩阵的每行元素,判断该矩阵是否为对称矩阵,若矩阵对称输出“Yes.“,不对称输出"No.”。
输入格式:
输入有多组,每一组第一行输入一个正整数N(N<=20),表示矩阵的行数(若N=0,表示输入结束)。
下面依次输入N行数据。
输出格式:
若矩阵对称输出“Yes.",不对称输出”No.”。
输入样例:
3
6 3 12
3 18 8
12 8 7
3
6 9 12
3 5 8
12 6 3
0
输出样例:
Yes.
No.
#include <stdio.h>
int main()
{
int a,c,d,cnt=0,e;
while(scanf("%d",&a)!=EOF&&a){
e=a-1;
e=2*e-1;
int b[a][a];
for(c=0;c<a;c++){
for(d=0;d<a;d++){
scanf("%d",&b[c][d]);
}
}
for(c=0;c<a;c++){
for(d=0;d<a;d++){
if(b[c][d]==b[d][c]){
if(c==d){
continue;
}
cnt++;
}
}
}
if(cnt/2==e){
printf("Yes.\n");
}else{
printf("No.\n");
}
}
}
7-4 sdut-C语言实验- 杨辉三角
分数 10
作者 马新娟
单位 山东理工大学
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
上面的图形熟悉吗?它就是我们中学时候学过的杨辉三角。
输入格式:
输入数据包含多组测试数据。
每组测试数据的输入只有一个正整数n(1≤n≤30),表示将要输出的杨辉三角的层数。
输入以0结束。
输出格式:
对应于每一个输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开,每一个杨辉三角后面加一个空行。
输入样例:
2
3
0
输出样例:
1
1 1
1
1 1
1 2 1
#include<stdio.h>
int main()
{
int n;
while(~scanf("%d",&n)&&n){
int a[n][n];
a[0][0]=1;
printf("1\n");
for(int i=1;i<n;i++){
for(int j=0;j<=i;j++){
if(j==0){a[i][j]=1;printf("1 ");}
else if(j==i){a[i][j]=1;printf("1");}
else {a[i][j]=a[i-1][j-1]+a[i-1][j];
printf("%d ",a[i][j]);}
}
printf("\n");
}printf("\n");
}
}
7-5 sdut-C语言实验- 鞍点计算
分数 12
作者 马新娟
单位 山东理工大学
找出具有m行n列二维数组Array的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10。同一行和同一列没有相同的数。
输入格式:
输入数据有多行,第一行有两个数m和n,下面有m行,每行有n个数。
输出格式:
按下列格式输出鞍点:
Array[i][j]=x
其中,x代表鞍点,i和j为鞍点所在的数组行和列下标,我们规定数组下标从0开始。
一个二维数组并不一定存在鞍点,此时请输出None。
我们保证不会出现两个鞍点的情况,比如:
3 3
1 2 3
1 2 3
3 6 8
输入样例:
3 3
1 2 3
4 5 6
7 8 9
输出样例:
Array[0][2]=3
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m,n,i,j,a[10][10],b,c,d,t;
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<m;i++)
{
d=i;
b=0;
t=0;
for(j=0;j<n;j++)
{
if(a[i][j]>a[d][b])
{
b=j;
d=i;
}
}
for(c=0;c<m;c++)
{
if(a[c][b]<a[d][b])
break;
else
t=t+1;
}
if(t==m)
{
printf("Array[%d][%d]=%d",d,b,a[d][b]);
break;
}
}
if(t!=m)
printf("None");
return 0;
}
7-6 sdut- C语言实验-矩阵转置
分数 9
作者 马新娟
单位 山东理工大学
输入N*N的矩阵,输出它的转置矩阵。
输入格式:
第一行为整数N(1≤N≤100)。
接着是一个N*N的矩阵。
输出格式:
转置矩阵。
输入样例:
2
1 2
1 2
输出样例:
1 1
2 2
#include<stdio.h>
int main()
{
int n,j,i;
int a[100][100];
scanf("%d",&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==0)
printf("%d",a[j][i]);
else
printf(" %d",a[j][i]);
}
printf("\n");
}
return 0;
}
7-7 矩阵列平移
分数 20
作者 陈越
单位 浙江大学
给定一个 n×n 的整数矩阵。对任一给定的正整数 k<n,我们将矩阵的偶数列的元素整体向下依次平移 1、……、k、1、……、k、…… 个位置,平移空出的位置用整数 x 补。你需要计算出结果矩阵的每一行元素的和。
输入格式:
输入第一行给出 3 个正整数:n(<100)、k(<n)、x(<100),分别如题面所述。
接下来 n 行,每行给出 n 个不超过 100 的正整数,为矩阵元素的值。数字间以空格分隔。
输出格式:
在一行中输出平移后第 1 到 n 行元素的和。数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
7 2 99
11 87 23 67 20 75 89
37 94 27 91 63 50 11
44 38 50 26 40 26 24
73 85 63 28 62 18 68
15 83 27 97 88 25 43
23 78 98 20 30 81 99
77 36 48 59 25 34 22
输出样例:
440 399 369 421 302 386 428
样例解读
需要平移的是第 2、4、6 列。给定 k=2,应该将这三列顺次整体向下平移 1、2、1 位(如果有更多列,就应该按照 1、2、1、2 …… 这个规律顺次向下平移),顶端的空位用 99 来填充。平移后的矩阵变成:
11 99 23 99 20 99 89
37 87 27 99 63 75 11
44 94 50 67 40 50 24
73 38 63 91 62 26 68
15 85 27 26 88 18 43
23 83 98 28 30 25 99
77 78 48 97 25 81 22
#include<stdio.h>
int main()
{
int n,m,k,i,j,p=1,a[100][100],sum=0;
scanf("%d %d %d",&n,&m,&k);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=n-1;i>=0;i--) //从最后一行开始
{
p=1;
for(j=0;j<n;j++)
{
if((j+1)%2==0) //偶数列
{
if(i-p>=0) //判断 a数组中 以i-p为下标的元素是否存在
a[i][j]=a[i-p][j]; //存在 向下移p个单位
else //不存在 添k
a[i][j]=k;
p++; //移动的单位是1、2...p 接着 1、2...p
if((p>m)) //如果数组大 或者m的值小 p接着从1开始
p=1;
}
}
}
for(i=0;i<n;i++) //求每一列的和
{
for(j=0;j<n;j++)
sum+=a[i][j];
if(i<n-1) //控制空格
printf("%d ",sum);
else
printf("%d",sum);
sum=0;
}
return 0;
}
7-8 方阵循环右移
分数 20
作者 颜晖
单位 浙大城市学院
本题要求编写程序,将给定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 n, m, i, j;
scanf("%d %d", &m, &n);
int array[n][n];
for( i=0; i<n; i++ )
for( j=0; j<n; j++ )
scanf(" %d", &array[i][j]);
m %= n; // 确保m的值
for( i=0; i<n; i++ ){
for( j=0; j<n; j++ )
printf("%d ", array[i][(n-m+j)%n]);
putchar('\n');
}
return 0;
}