题目
问题描述
给定一个n×m矩阵相乘,求它的转置。其中1≤n≤20,1≤m≤20,矩阵中的每个元素都在整数类型(4字节)的表示范围内。
输入格式
第一行两个整数n和m;
第二行起,每行m个整数,共n行,表示n×m的矩阵。数据之间都用一个空格分隔。
输出格式
共m行,每行n个整数,数据间用一个空格分隔,表示转置后的矩阵。
样例输入
2 4
34 76 -54 7
-4 5 23 9
样例输出
34 -4
76 5
-54 23
7 9
问题分析
- 首先矩阵的大小范围为1<<m<<20,1<<n<<20;矩阵中的元素类型都为整型
int a[20][20]; //定义矩阵的大小和数据类型 - 实现矩阵的输入,定义一个InputFunc(int m,int n)函数
利用一个嵌套循环实现矩阵的输入,例如:一个a[2][3]矩阵,按照a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]的顺序输入 - 实现矩阵的转置输出,定义了一个OutputFunc(int m,int n)函数
利用一个嵌套循环实现矩阵的转置a[3][2]输出,则按照a[0][0] a[1][0] a[0][1] a[1][1] a[0][2] a[1][2]的顺序输出 - 个人想法:创建一个新矩阵,直接利用值的交换,也就是赋值的操作来实现,方阵是可以的,但是如果不是方阵可能就比较困难。例如:要实现a[2][3]矩阵的转置输出,创建矩阵b[3][2],利用赋值操作b[0][0]=a[0][0],b[1][0]=a[0][1],b[2][0]=a[0][2],b[0][1]=a[1][0],b[1][1]=a[1][1],b[2][1]=a[1][2],然后再输出矩阵b。这样好像有点多此一举的感觉。
代码实现
#include<iostream>
using namespace std;
int a[20][20];
void InputFunc(int m,int n)
{
for(int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cin >> a[i][j];
}
}
}
void OutputFunc(int m,int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << a[j][i] << " ";
}
cout << endl;
}
}
int main()
{
int m, n;
cin >> m >> n;
InputFunc(m, n);
cout << "矩阵a的转置为:" << endl;
OutputFunc(m, n);
system("pause");
return 0;
}
- 输出示例:
4 4
-1 3 7 9
8 6 4 1
0 3 7 -6
4 -9 10 7
矩阵a的转置为:
-1 8 0 4
3 6 3 -9
7 4 7 10
9 1 -6 7
请按任意键继续. . .
- 题目所给实现代码:
#include<iostream>
using namespace std;
int main()
{
int m, n;
int a[20][20];
int i, j;
cin >> m >> n;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
cin >> a[j][i];
}
}
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
};
return 0;
}
- 输出示例:
3 5
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7