二维数组---矩阵相关问题

矩阵问题

做到一些相关矩阵的题目,在这里总结一下呢

矩阵乘法

给定一个 m 行、n列的矩阵 A 和一个 n 行、m 列的矩阵 B。你需要用矩阵 A 与矩阵 B 相乘,并且将 m行 m 列的乘积结果输出
在这里插入图片描述

#include <stdio.h>
#include<string.h>

int main() {
int matrix_a[10][10];
int matrix_b[10][10];
int m,n;
int i,j,k;scanf("%d %d", &m, &n);//输入行和列
for (i = 0; i < m; i++) {   //输入a矩阵
    for (j = 0; j < n; j++) {
        scanf("%d", &matrix_a[i][j]);
    }
}

for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {//输入b矩阵
        scanf("%d", &matrix_b[i][j]);
    }
}  

for (i = 0; i < m; i++) {//输出矩阵的行循环
    for (j = 0; j < m; j++) {//输出矩阵的列循环
        for (k = 0; k < n; k++) {//每个元素的循环加
            value[i][j] += matrix_a[i][k] * matrix_b[k][j]; 
        }
        j == 0 || printf(" ");//控制空格输出
        printf("%d",value[i][j]);
    }
    printf("\n");//记得换行
}
return 0;
}

翻转矩阵

给定一个 m行、n 列的矩阵,你需要根据要求将它水平翻转或竖直翻转。
在这里插入图片描述`

#include<stdio.h>
int main() {
int m, n;
int matrix[105][105];
int i, j, k, t;
scanf("%d%d", &m, &n);
for (i = 0; i < m; i++) {
    for (j = 0; j < n; j++) {
        scanf("%d", &matrix[i][j]);
    }
}
scanf("%d", &k);
if (k == 1) {    //**k==1时表示水平翻转**
    for (i = 0; i < m; i++) {
        for (j = 0; j < n / 2; j++) { //列数只循环一半即可
            t = matrix[i][j];         //矩阵值的交换
            matrix[i][j] = matrix[i][n - 1 - j];
            matrix[i][n - 1- j] = t;
        }
    }
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            j == 0 || printf(" ");   //为了输出空格
            printf("%d", matrix[i][j]);
        }
        printf("\n");
    }
}if (k == 0) {      //**k== 0时表示垂直翻转**
    for (i = 0; i < m / 2; i++) {  //行数只循环一半即可
        for (j = 0; j < n; j++) {
            t = matrix[i][j];           //矩阵值的交换
            matrix[i][j] = matrix[m - 1 - i][j];
            matrix[m - 1 - i][j] = t;
        }
    }
    
    for (i = 0; i < m; i++) {     //矩阵输出
        for (j = 0; j < n; j++ ){
            j == 0 || printf(" ");
            printf("%d", matrix[i][j]);
        }
        printf("\n");   //记得换行
    }
}
return 0;
}

`

旋转矩阵

对于一个给定的 3×3 矩阵,请将其顺时针旋转 90度后输出
在这里插入图片描述

#include <stdio.h>int main() {
int matrix[3][3];
int i;
int j;
int result[3][3];
for (i = 0; i < 3; i++){
    for (j = 0; j < 3; j++){
        scanf("%d ", &matrix[i][j]);
    }
}

for (i = 0; i < 3; i++){
    for (j = 0; j < 3; j++){
        result[j][3 - i - 1] = matrix[i][j];  //注意这里的转换公式即可
    }
}for (i = 0; i < 3; i++){
    for (j = 0; j < 3; j++){
        j == 0 || printf(" ");
        printf("%d", result[i][j]);
        //if (j != 2) printf(" ");
    }printf("\n");
}

return 0;

}`

螺旋矩阵

给定一个 m 行、n 列的矩阵,请按照顺时针螺旋的顺序输出矩阵中所有的元素(从[0][0]位置开始,具体请参见下图)。
在这里插入图片描述在这里插入图片描述

#include <stdio.h>
void space(int, int);
int main() {
    int matrix[101][101];
    int m;
    int n;
    int i, j;
    // 输入m*n的矩阵
    scanf("%d%d", &m, &n);
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
    //定义上下左右边界,每次边上的数后,更新周围的值
    int up = 0, left = 0, down = m-1, right = n-1;
    int k, num = 0;
    while (up <= down && left <= right) {
        // 向右输出
        for (k = left; k <= right; k++) {
            printf("%d", matrix[up][k]);
            num++;
            space(num, m*n);
        }
        up++;
        if (num == m*n)  //如果全部数值已经输出完毕,退出while循环
            break;
        // 向下输出
        for (k = up; k <= down; k++) {
            printf("%d", matrix[k][right]);
            num++;
            space(num, m*n);
        }
        right--;
        if (num == m*n)  //如果全部数值已经输出完毕,退出while循环
            break;
        // 向左输出
        for (k = right ; k >= left; k--) {
            printf("%d", matrix[down][k]);
            num++;
            space(num, m*n);
        }
        down--;
        if (num == m*n)  //如果全部数值已经输出完毕,退出while循环
            break;
        // 向上输出
        for (k = down; k >= up; k--) {
            printf("%d", matrix[k][left]);
            num++;
            space(num, m*n);
        }
        left++;
        if (num == m*n)  //如果全部数值已经输出完毕,退出while循环
            break;
    }
    return 0;
}
//判断每次输出数字后是否要输出空格
void space(num, all) {
    if (num < all)
        printf(" ");
}

以上问题仅供参考,有更好的方法欢迎交流

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值