方阵。下图中,C 是一个方阵,A 是一个下三角矩阵,B 是一个上三角矩阵。
矩阵 C=A×B,上图中是计算三角矩阵乘法的公式。写一个 C 语言的程序,读 入一个正整数 n,5≤n≤20, 设为方阵的行数与列数。使用动态内存分配三角矩阵 A、B、和 C 不为 0 的内存空间,并分别为下三角矩阵 A 和上三角矩阵 B 随 机生成元素 ai,j (i≥j) 和 bi,j (i≤j);假设 -99≤ai,j, bi,j≤99。然后计算矩阵乘法 C=A ×B,并输出矩阵 A、B 和 C,不要打印矩阵 A 的上三角和矩阵 B 的下三角 值为 0 的元素。(提示:若列下标从为 0 至 n-1,下三角矩阵的第 i 列有 i+1 个 非 0 元素;上三角矩阵的第 i 列有 n-i 个非 0 元素,且向左移位 i 个位置
数据结构xxxxxxx
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- K_n_i_g_h_t_1990 2023-11-01 10:29关注
#include <stdio.h> #include <stdlib.h> #include <time.h> // 定义一个结构体,用来存储三角矩阵的信息 typedef struct { int n; // 矩阵的行数和列数 int *data; // 矩阵的非零元素数组 int type; // 矩阵的类型,0表示下三角,1表示上三角 } TriMatrix; // 创建一个三角矩阵,并随机生成元素 TriMatrix *create_tri_matrix(int n, int type) { TriMatrix *matrix = (TriMatrix *)malloc(sizeof(TriMatrix)); // 分配结构体内存 matrix->n = n; matrix->type = type; int size = n * (n + 1) / 2; // 计算非零元素的个数 matrix->data = (int *)malloc(sizeof(int) * size); // 分配数组内存 for (int i = 0; i < size; i++) { matrix->data[i] = rand() % 199 - 99; // 随机生成-99到99之间的整数 } return matrix; } // 销毁一个三角矩阵,释放内存 void destroy_tri_matrix(TriMatrix *matrix) { free(matrix->data); // 释放数组内存 free(matrix); // 释放结构体内存 } // 打印一个三角矩阵,不打印值为0的元素 void print_tri_matrix(TriMatrix *matrix) { int n = matrix->n; int type = matrix->type; int index = 0; // 数组下标 for (int i = 0; i < n; i++) { // 遍历每一行 for (int j = 0; j < n; j++) { // 遍历每一列 if ((type == 0 && i >= j) || (type == 1 && i <= j)) { // 判断是否是非零元素所在位置 printf("%d\t", matrix->data[index]); // 打印非零元素 index++; // 更新数组下标 } else { printf("0\t"); // 打印0元素 } } printf("\n"); // 换行 } } // 计算两个三角矩阵的乘积,返回一个方阵 TriMatrix *multiply_tri_matrix(TriMatrix *A, TriMatrix *B) { if (A->n != B->n || A->type != 0 || B->type != 1) { // 判断是否满足乘法条件,即两个矩阵都是方阵,且A是下三角,B是上三角 return NULL; // 不满足条件则返回空指针 } int n = A->n; TriMatrix *C = create_tri_matrix(n, 1); // 创建一个上三角矩阵作为结果 for (int i = 0; i < n; i++) { // 遍历每一行 for (int j = i; j < n; j++) { // 遍历每一列,只计算上三角部分 int sum = 0; // 累加器,用来计算C[i][j]的值 for (int k = i; k <= j; k++) { // 遍历A的第i行和B的第j列的非零元素,按照公式计算乘积并累加 sum += A->data[i * (i + 1) / 2 + k] * B->data[k * (2 * n - k + 1) / 2 + j]; } C->data[i * (2 * n - i + 1) / 2 + j] = sum; // 将累加器的值赋给C[i][j] } } return C; } int main() { srand(time(NULL)); // 设置随机数种子 int n; // 矩阵的行数和列数 printf("请输入一个正整数n,5<=n<=20,作为方阵的行数与列数:\n"); scanf("%d", &n); // 输入n if (n < 5 || n > 20) { // 判断n是否在范围内 printf("输入错误,程序结束。\n"); return 0; } TriMatrix *A = create_tri_matrix(n, 0); // 创建一个下三角矩阵A TriMatrix *B = create_tri_matrix(n, 1); // 创建一个上三角矩阵B TriMatrix *C = multiply_tri_matrix(A, B); // 计算矩阵乘法C = A * B printf("矩阵A为:\n"); print_tri_matrix(A); // 打印矩阵A printf("矩阵B为:\n"); print_tri_matrix(B); // 打印矩阵B printf("矩阵C为:\n"); print_tri_matrix(C); // 打印矩阵C destroy_tri_matrix(A); // 销毁矩阵A destroy_tri_matrix(B); // 销毁矩阵B destroy_tri_matrix(C); // 销毁矩阵C return 0; }
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 三极管电路求解,已知电阻电压和三级关放大倍数
- ¥15 ADS时域 连续相位观察方法
- ¥15 Opencv配置出错
- ¥15 模电中二极管,三极管和电容的应用
- ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
- ¥15 气象网格数据与卫星轨道数据如何匹配
- ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
- ¥15 微软账户问题不小心注销了好像
- ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
- ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused