WUSTOJ 1232: 矩阵乘法(C)

80 篇文章 18 订阅
27 篇文章 3 订阅

1232: 矩阵乘法

Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld

Description

小明明正在学习线性代数,老师布置了好多矩阵相乘的题目,手算累死了。最近刚学习了c语言,小明明灵机一动,决定让小伙伴帮他编一个程序用来计算矩阵相乘。亲爱的小伙伴们,不要让小明明童鞋失望哦哟嚯嚯嚯嚯v

Input

首先输入一个n,然后n个数据块。

每个数据块先给3个正整数N,M,P(N,M,P均不大于13)。

然后给一个NM的矩阵A,再接着给一个MP的矩阵B。

矩阵A和B的元素都是一个不大于37的非负整数。

详情请见sample。

Output

输出n个矩阵,分别表示A*B的结果。注意以%6d的格式输出,行末不能有空格。每个矩阵输出后再输出一个空行,具体见sample

Sample Input

2
2 3 2
1 2 3
4 5 6
1 2
1 2
1 2

1 2 3
1 2
1 2 3
4 5 6

Sample Output

     6    12
    15    30

     9    12    15

HINT

注意格式:每个数字宽度为6,即%6d的格式输出每个数字,每行末尾不能有多余的空格。

每个矩阵输出后再输出一个空行以示分隔。看清样例。

代码

原理比较简单,不单独分析,看注释就可以。
网页评判是404ms,但我看到了不到200ms的大神,如果愿意分享代码,在此感谢。可以评论附上关键代码或者邮箱1

// wustoj ac 404ms
#include<stdio.h>
#include<string.h>

#define MAX 14		// 矩阵最大为13*13的

int main()
{
	// A[N][M], B[M][P]
	int n, N, M, P, i, j, k;
	int matrixA[MAX][MAX], matrixB[MAX][MAX], matrixAns[MAX][MAX];

	scanf("%d", &n);	// 输入数据组数
	while (n--)
	{
		scanf("%d%d%d", &N, &M, &P);
		// 输入A矩阵
		for (i = 0; i < N; i++)
		{
			for (j = 0; j < M; j++)
			{
				scanf("%d", &matrixA[i][j]);
			}
		}
		// 输入B矩阵
		for (i = 0; i < M; i++)
		{
			for (j = 0; j < P; j++)
			{
				scanf("%d", &matrixB[i][j]);
			}
		}
		// 重置为0
		memset(matrixAns, 0, sizeof(matrixAns));
		// 计算乘法
		for (i = 0; i < P; i++)
		{
			for (j = 0; j < M; j++)
			{
				for (k = 0; k < N; k++)
				{
					matrixAns[k][i] += matrixA[k][j] * matrixB[j][i];
				}
			}
		}
		// 输出结果
		for (i = 0; i < N; i++)
		{
			for (j = 0; j < P; j++)
			{
				printf("%6d", matrixAns[i][j]);
			}
			printf("\n");
		}
		// 每组数据空一行
		printf("\n");
	}
	return 0;
}

Java版(提交超时,暂未解决,希望有人指点)

代码在Eclipse运行结果正确,OJ提交一直超时(Time Limit Exceed)

import java.util.Scanner;

public class Main {

	public Main() {
		Scanner sc = new Scanner(System.in);
		int n;
		// 输入数据组数
		n = sc.nextInt();
		while(n > 0) {
			// 输入矩阵大小
			int N, M, P;
			N = sc.nextInt();
			M = sc.nextInt();
			P = sc.nextInt();
			// 申请空间
			int[][] matrixA = new int[N][M];
			int[][] matrixB = new int[M][P];
			// 输入矩阵A
			for(int i = 0; i < N; i++) {
				for(int j = 0; j < M; j++) {
					matrixA[i][j] = sc.nextInt();
				}
			}
			// 输入矩阵B
			for(int i = 0; i < M; i++) {
				for(int j = 0; j < P; j++) {
					matrixB[i][j] = sc.nextInt();
				}
			}
			// 申请保存结果的数组
			int[][] matrixAns = new int[N][P];
			// 计算乘法
			for(int i = 0; i < N; i++) {
				for(int j = 0; j < P; j++) {
					for(int k = 0; k < M; k++) {
						matrixAns[i][j] += matrixA[i][k] * matrixB[k][j];
					}
				}
			}
			// 输出结果
			for(int i = 0; i < N; i++) {
				for(int j = 0; j < P; j++) {
					System.out.printf("%6d", matrixAns[i][j]);
				}
				System.out.println();
			}
			// 每组数据空一行
			System.out.println();
			n--;
		}
		sc.close();
	}

	public static void main(String[] args) {
		new Main();
	}

}

【End】

  1. QQ邮箱:929450073@qq.com ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值