写在前面:
一道需要一点思考时间的模拟题
实验内容及要求:
已知两个n阶下半三角矩阵的乘积仍为n阶下半三角矩阵。编程输入两个n阶下半三角矩阵,输出这两个矩阵的乘积。要求n阶下半三角矩阵采用一维数组压缩存储(即只存储下半三角)。
程序先从键盘(或字符文件)输入n值,建立三个矩阵的一维数组动态存储结构,然后从键盘(或字符文件)输入两个半三角矩阵,最后输出计算结果到屏幕上(或另一个字符文件中)。
例如:键盘输入为:
3
1
2 3
4 5 6
-1
-2 -3
-4 -5 -6
则输出为:
-1
-8 -9
-38 -45 -36
实验目的:掌握半三角矩阵的顺序存储结构。
实验代码:
#include "iostream"
using namespace std;
int posi(int i, int j) {
int length = 0;
for (int count = 0; count < i; count++) {
length += count;
}
length += j - 1;
return length;
}
void matrix_multiplication(const int *matrix1, const int* matrix2, int* matrix_sum, int n) {
for (int i = 0; i <= n; i++) {
for (int j = 0; j < n; j++) {
for (int k = j; k <= i; k++) {
matrix_sum[posi(i + 1, j + 1)] += matrix1[posi(k + 1, j + 1)] * matrix2[posi(i + 1, k + 1)];
}
}
}
}
void readMatrix(int matrix[], int n) {
for (int i = 0; i < n; i++)
for (int j = 0; j <= i; j++) {
cin >> matrix[i * (i + 1) / 2 + j];
}
}
int main() {
int n;
cin >> n;
int *matrix1, *matrix2, *matrix_sum;
int length = 0;
for (int i = 1; i <= n; i++) {
length += i;
}
matrix1 = new int[length];
matrix2 = new int[length];
matrix_sum = new int[length];
readMatrix(matrix1, n);
readMatrix(matrix2, n);
for (int i = 0; i < length; i++) {
matrix_sum[i] = 0;
}
matrix_multiplication(matrix1, matrix2, matrix_sum, n);
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
cout << matrix_sum[posi(i + 1, j + 1)] << " ";
}
cout << endl;
}
return 0;
}
程序有一点小瑕疵,在输入用例过后你就知道是什么了,结果是正确的,但是不知道怎么解决掉这个小瑕疵,有知道的佬告诉一声,谢谢。
文章评论