鱼C论坛

 找回密码
 立即注册
查看: 965|回复: 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++才行。仅供参考:
#include <stdio.h>

struct Info {
        long long data[501][501];
        int n, m;
        void init() {
                memset(data, 0, sizeof(data));
                n = m = 0;
        }
        Info operator * (const Info &b) const {
                Info res;
                memset(res.data, 0, sizeof(res.data));
                res.n = n;
                res.m = b.m;
                for (int i = 1; i <= res.n; i++)
                        for (int j = 1; j <= res.m; j++)
                                for (int k = 1; k <= b.n; k++)
                                        res.data[i][j] += data[i][k] * b.data[k][j];
                return res;
        }
};

Info a, b, c;
int main() {
a.init(); b.init(); c.init();
        scanf("%d%d%d", &a.n, &a.m, &b.m);
        b.n = a.m;
        for (int i = 1; i <= a.n; ++i) {
                for (int j = 1; j <= a.m; ++j) {
                        scanf("%lld", &a.data[i][j]);
                }
        }
        for (int i = 1; i <= b.n; ++i) {
                for (int j = 1; j <= b.m; ++j) {
                        scanf("%lld", &b.data[i][j]);
                }
        }
        c = a * b;
        for (int i = 1; i <= c.n; ++i) {
                for (int j = 1; j <= c.m; ++j) printf("%lld ", c.data[i][j]);
                puts("");
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

代码实现如下:
#include <stdio.h>void matrix_multiply(int n, int m, int k, int A[n][m], int B[m][k], int C[n][k]) {    for (int i = 0; i < n; i++) {        for (int j = 0; j < k; j++) {            C[i][j] = 0; // 初始化C矩阵的对应位置为0                        for (int x = 0; x < m; x++) {                C[i][j] += A[i][x] * B[x][j]; // 累加乘积结果到C矩阵的对应位置上            }        }    }}int main() {    int n, m, k;    scanf("%d %d %d", &n, &m, &k);        int A[n][m];    for (int i = 0; i < n; i++) {        for (int j = 0; j < m; j++) {            scanf("%d", &A[i][j]);        }    }        int B[m][k];    for (int i = 0; i < m; i++) {        for (int j = 0; j < k; j++) {            scanf("%d", &B[i][j]);        }    }        int C[n][k];    matrix_multiply(n, m, k, A, B, C);        for (int i = 0; i < n; i++) {        for (int j = 0; j < k; j++) {            printf("%d ", C[i][j]);        }        printf("\n");    }        return 0;}
这样,我们就可以计算出两个矩阵的乘积并输出结果了。

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

使用道具 举报

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

struct Info {
        long long data[501][501];
        int n, m;
        void init() {
                memset(data, 0, sizeof(data));
                n = m = 0;
        }
        Info operator * (const Info &b) const {
                Info res;
                memset(res.data, 0, sizeof(res.data));
                res.n = n;
                res.m = b.m;
                for (int i = 1; i <= res.n; i++)
                        for (int j = 1; j <= res.m; j++)
                                for (int k = 1; k <= b.n; k++)
                                        res.data[i][j] += data[i][k] * b.data[k][j];
                return res;
        }
};

Info a, b, c;
int main() {
a.init(); b.init(); c.init();
        scanf("%d%d%d", &a.n, &a.m, &b.m);
        b.n = a.m;
        for (int i = 1; i <= a.n; ++i) {
                for (int j = 1; j <= a.m; ++j) {
                        scanf("%lld", &a.data[i][j]);
                }
        }
        for (int i = 1; i <= b.n; ++i) {
                for (int j = 1; j <= b.m; ++j) {
                        scanf("%lld", &b.data[i][j]);
                }
        }
        c = a * b;
        for (int i = 1; i <= c.n; ++i) {
                for (int j = 1; j <= c.m; ++j) printf("%lld ", c.data[i][j]);
                puts("");
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 12:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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