zoukankan      html  css  js  c++  java
  • WUSTOJ 1232: 矩阵乘法(C)

    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("
    ");
    		}
    		// 每组数据空一行
    		printf("
    ");
    	}
    	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 ↩︎

  • 相关阅读:
    MOSS 2013研究系列动态修改WebConfig(上) 欧阳锋
    MOSS 2013研究系列MOSS 2013安装篇 欧阳锋
    GPIO
    [转]vi/vim使用进阶: 在VIM中使用GDB调试 – 使用pyclewn
    建立openwrt虚拟环境
    ebtables基本使用
    LFS小记
    Autoconf & Automake使用小记
    Packet Filter小记
    Web技术整理
  • 原文地址:https://www.cnblogs.com/wowpH/p/11060841.html
Copyright © 2011-2022 走看看