矩阵乘法(C语言)

来源:互联网 发布:windows关闭网络唤醒 编辑:程序博客网 时间:2024/05/29 08:24

Description


矩阵乘法是线性代数中最基本的运算之一。
给定三个矩阵,请编写程序判断是否成立。

Input


输入包含多组数据。每组数据的格式如下:
第一行包括两个整数p和q,表示矩阵A的大小。后继p行,每行有q个整数,表示矩阵A的元素内容。
紧接着用相同的格式给出矩阵B和矩阵C。
输入数据的最后一行是两个0,你的程序处理到这里时就应该退出了。
输入数据中所有的整数绝对值都不超过100。

Output


对每一组输入数据,你的程序都要输出单独一行字符。
如果成立则输出”Yes”
如果A和B根本不能相乘,或不成立,则输出”No”。注意大小写。

Sample Input


2 3
1 2 3
4 5 6
3 2
1 2
3 4
5 6
2 2
22 28
49 64

1 2
1 2
2 1
2
1
2 2
2 4
1 2

1 2
1 2
1 1
1
1 1
1

0 0

Sample Output


Yes
No
No
题目链接 http://ccpc.ahu.edu.cn:8080/OJ/Problem.aspx?id=470

题目考察要点。矩阵A X B=C
(1)两矩阵A B相乘的矩阵A的列必须等于矩阵B的行数,矩阵A与矩阵B才能相乘;
(2)矩阵C的行数必须等于矩阵A的行数,矩阵C列数必须等于矩阵B的列数;
若不太理解矩阵乘法可以用简单的几个数试一下,对应行乘对应列


AC的代码
#include<stdio.h>int main(){int a1,a2,b1,b2,c1,c2, p,q,i,j,n,m,k,k1,k2,r1,r2, a[100][100], b[100][100], c[100][100],temp, r[100][100]  ; while(scanf("%d %d",&p, &q))   //限制输出的的组数{ if(p==0&&q==0) break;for(a1=0;a1<p;a1++)for(a2=0;a2<q;a2++)scanf("%d",&a[a1][a2]);scanf("%d %d",&m, &n);for(a1=0;a1<m;a1++)for(a2=0;a2<n;a2++)scanf("%d",&b[a1][a2]);scanf("%d %d",&i, &j);for(c1=0;c1<i;c1++)for(c2=0;c2<j;c2++)scanf("%d",&c[c1][c2]);  //定义的输出的几组数据if((q!=m)||(i!=p)||(j!=n))   printf("No\n");  //判断不满足矩阵相乘条件,若要判断满足条件不一定能考虑全情况else {for(a1=0;a1<p;a1++){for(a2=0;a2<n;a2++){temp=0;for(k=0;k<m;k++){temp+=a[a1][k]*b[k][a2];//相乘的算法}if(temp!=c[a1][a2]) printf("No\n");//对应判断行列相乘的结果,与结果的矩阵对应比较又不满足的就跳出}}if(i==p &&j==n)   printf("Yes\n");else printf("No\n");}}return 0;}


 效率的提高可以用判断结果对应位置只要不满足就跳出。不需要用每一个位置都判断。
后期学长给的代码
#include<stdio.h>int main(){    int A[100][100],B[100][100],C[100][100],A_n,A_m,B_n,B_m,C_n,C_m,i,j,k,sum;    while(scanf("%d%d",&A_n,&A_m) && ( A_n || A_m )){        for(i=0;i<A_n;i++)            for(j=0;j<A_m;j++){                scanf("%d",&A[i][j]);                            }        scanf("%d%d",&B_n,&B_m);        for(i=0;i<B_n;i++)            for(j=0;j<B_m;j++){                scanf("%d",&B[i][j]);                            }        scanf("%d%d",&C_n,&C_m);        for(i=0;i<C_n;i++)            for(j=0;j<C_m;j++){                scanf("%d",&C[i][j]);                            }        if(A_m!=B_n  || (A_n!=C_n || B_m!=C_m))printf("No\n");        else{            for(i=0;i<A_n;i++)                for(j=0;j<B_m;j++){                    sum=0;                    for(k=0;k<A_m;k++)                        sum+=A[i][k]*B[k][j];                    if(sum!=C[i][j])break;                             }            if(i==A_n && j==B_m)printf("Yes\n");            else printf("No\n");        }    }    return 0; } 




原创粉丝点击