鱼C论坛

 找回密码
 立即注册
查看: 587|回复: 2

[已解决]C

[复制链接]
发表于 2023-12-14 20:13:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目描述
计算两个矩阵的乘法。n×m 阶的矩阵A乘以m×k 阶的矩阵B得到的矩阵C是n×k 阶的,且C[i][j]=A[i][0]×B[0][j]+A[i][1]×B[1][j]+……+A[i][m−1]×B[m−1][j]  (C[i][j] 表示 C 矩阵中第 i 行第 j 列元素)。
输入描述
第一行为 n, m, k,表示 A 矩阵是n行m列,B矩阵是m行k列,n,m,k 均小于100;
然后先后输入A和B两个矩阵,A矩阵n行m列,B矩阵m行k列,矩阵中每个元素的绝对值不会大于 1000。



输出描述
输出矩阵 C,一共 n 行,每行 k 个整数,整数之间以一个空格分开。
最佳答案
2023-12-15 11:52:57
C过不了编译啊,C++才行。仅供参考:

  1. #include <stdio.h>

  2. struct Info {
  3.         long long data[501][501];
  4.         int n, m;
  5.         void init() {
  6.                 memset(data, 0, sizeof(data));
  7.                 n = m = 0;
  8.         }
  9.         Info operator * (const Info &b) const {
  10.                 Info res;
  11.                 memset(res.data, 0, sizeof(res.data));
  12.                 res.n = n;
  13.                 res.m = b.m;
  14.                 for (int i = 1; i <= res.n; i++)
  15.                         for (int j = 1; j <= res.m; j++)
  16.                                 for (int k = 1; k <= b.n; k++)
  17.                                         res.data[i][j] += data[i][k] * b.data[k][j];
  18.                 return res;
  19.         }
  20. };

  21. Info a, b, c;
  22. int main() {
  23. a.init(); b.init(); c.init();
  24.         scanf("%d%d%d", &a.n, &a.m, &b.m);
  25.         b.n = a.m;
  26.         for (int i = 1; i <= a.n; ++i) {
  27.                 for (int j = 1; j <= a.m; ++j) {
  28.                         scanf("%lld", &a.data[i][j]);
  29.                 }
  30.         }
  31.         for (int i = 1; i <= b.n; ++i) {
  32.                 for (int j = 1; j <= b.m; ++j) {
  33.                         scanf("%lld", &b.data[i][j]);
  34.                 }
  35.         }
  36.         c = a * b;
  37.         for (int i = 1; i <= c.n; ++i) {
  38.                 for (int j = 1; j <= c.m; ++j) printf("%lld ", c.data[i][j]);
  39.                 puts("");
  40.         }
  41. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-14 20:14:06 | 显示全部楼层
思路:
首先,根据输入描述,我们可以得知矩阵A的行数是n,列数是m,矩阵B的行数是m,列数是k。
然后,我们需要创建一个n行k列的矩阵C来保存结果。
接下来,遍历A的每一行和B的每一列,将对应位置的元素相乘并累加到C的对应位置上。
最后,输出矩阵C。

代码实现如下:
  1. #include <stdio.h>
  2. void matrix_multiply(int n, int m, int k, int A[n][m], int B[m][k], int C[n][k]) {
  3.     for (int i = 0; i < n; i++) {
  4.         for (int j = 0; j < k; j++) {
  5.             C[i][j] = 0; // 初始化C矩阵的对应位置为0
  6.             
  7.             for (int x = 0; x < m; x++) {
  8.                 C[i][j] += A[i][x] * B[x][j]; // 累加乘积结果到C矩阵的对应位置上
  9.             }
  10.         }
  11.     }
  12. }
  13. int main() {
  14.     int n, m, k;
  15.     scanf("%d %d %d", &n, &m, &k);
  16.    
  17.     int A[n][m];
  18.     for (int i = 0; i < n; i++) {
  19.         for (int j = 0; j < m; j++) {
  20.             scanf("%d", &A[i][j]);
  21.         }
  22.     }
  23.    
  24.     int B[m][k];
  25.     for (int i = 0; i < m; i++) {
  26.         for (int j = 0; j < k; j++) {
  27.             scanf("%d", &B[i][j]);
  28.         }
  29.     }
  30.    
  31.     int C[n][k];
  32.     matrix_multiply(n, m, k, A, B, C);
  33.    
  34.     for (int i = 0; i < n; i++) {
  35.         for (int j = 0; j < k; j++) {
  36.             printf("%d ", C[i][j]);
  37.         }
  38.         printf("\n");
  39.     }
  40.    
  41.     return 0;
  42. }
复制代码

这样,我们就可以计算出两个矩阵的乘积并输出结果了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-15 11:52:57 | 显示全部楼层    本楼为最佳答案   
C过不了编译啊,C++才行。仅供参考:

  1. #include <stdio.h>

  2. struct Info {
  3.         long long data[501][501];
  4.         int n, m;
  5.         void init() {
  6.                 memset(data, 0, sizeof(data));
  7.                 n = m = 0;
  8.         }
  9.         Info operator * (const Info &b) const {
  10.                 Info res;
  11.                 memset(res.data, 0, sizeof(res.data));
  12.                 res.n = n;
  13.                 res.m = b.m;
  14.                 for (int i = 1; i <= res.n; i++)
  15.                         for (int j = 1; j <= res.m; j++)
  16.                                 for (int k = 1; k <= b.n; k++)
  17.                                         res.data[i][j] += data[i][k] * b.data[k][j];
  18.                 return res;
  19.         }
  20. };

  21. Info a, b, c;
  22. int main() {
  23. a.init(); b.init(); c.init();
  24.         scanf("%d%d%d", &a.n, &a.m, &b.m);
  25.         b.n = a.m;
  26.         for (int i = 1; i <= a.n; ++i) {
  27.                 for (int j = 1; j <= a.m; ++j) {
  28.                         scanf("%lld", &a.data[i][j]);
  29.                 }
  30.         }
  31.         for (int i = 1; i <= b.n; ++i) {
  32.                 for (int j = 1; j <= b.m; ++j) {
  33.                         scanf("%lld", &b.data[i][j]);
  34.                 }
  35.         }
  36.         c = a * b;
  37.         for (int i = 1; i <= c.n; ++i) {
  38.                 for (int j = 1; j <= c.m; ++j) printf("%lld ", c.data[i][j]);
  39.                 puts("");
  40.         }
  41. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-25 01:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表