二维数组---矩阵相关问题
Posted buling_buling_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二维数组---矩阵相关问题相关的知识,希望对你有一定的参考价值。
矩阵问题
做到一些相关矩阵的题目,在这里总结一下呢
矩阵乘法
给定一个 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(" ");
}
以上问题仅供参考,有更好的方法欢迎交流
以上是关于二维数组---矩阵相关问题的主要内容,如果未能解决你的问题,请参考以下文章