矩阵(加法&&乘法&&快速幂)

来源:互联网 发布:网络的好处 英语作文 编辑:程序博客网 时间:2024/05/29 04:18

矩阵相乘:

#include<cstdio>int main(){    int m1,m2,n1,n2;    int t;    int a[105][105];    int b[105][105];    int c[105][105];    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&m1,&n1);        for(int i=0;i<m1;i++)            for(int j=0;j<n1;j++)                scanf("%d",&a[i][j]);         scanf("%d%d",&m2,&n2);        for(int i=0;i<m2;i++)            for(int j=0;j<n2;j++)                scanf("%d",&b[i][j]);         if(n1!=m2)//矩阵相乘的条件:第一个矩阵的列等于第二个矩阵的行         printf("NO\n");        else        {            int sum=0;            printf("YES\n");            for(int i=0;i<m1;i++)            {                for(int j=0;j<n2;j++)                {                    for(int k=0;k<n1;k++)                    {                         sum=sum+a[i][k]*b[k][j];                    }                    c[i][j]=sum;                    sum=0;                }            }               for(int i=0;i<m1;i++)                for(int j=0;j<n2;j++)                    printf("%d%c",c[i][j],j==n2-1?'\n':' ');            }       }    return 0; }

矩阵相加:

#include<cstdio>int main(){    int a[55][55];    int b[55][55];    int c[55][55];    int m,n;    scanf("%d%d",&m,&n);    for(int i=0;i<m;i++)        for(int j=0;j<n;j++)            scanf("%d",&a[i][j]);    for(int i=0;i<m;i++)        for(int j=0;j<n;j++)            scanf("%d",&b[i][j]);    for(int i=0;i<m;i++)        for(int j=0;j<n;j++)            c[i][j]=a[i][j]+b[i][j];    for(int i=0;i<m;i++)        for(int j=0;j<n;j++)            printf("%d%c",c[i][j],j==n-1?'\n':' ');     return 0;}

矩阵快速幂:

#include<cstdio>struct Node{    int a[100][100];}m,n;int M,N;Node mtmul(Node p,Node q)//矩阵乘法 {    int sum=0;    for(int i=0;i<M;i++)    {        for(int j=0;j<N;j++)        {            for(int k=0;k<M;k++)            {                sum+=p.a[i][k]*q.a[k][j];            }            n.a[i][j]=sum;            sum=0;        }    }    return n;}Node mtPow(Node A,int n)//参考快速幂算法 {    if(n==1)    return A;    A=mtPow(A,n/2);    if(n%2==0)        return mtmul(A,A);    else         return mtmul(mtmul(A,A),m); }int main(){    scanf("%d%d",&M,&N);        for(int i=0;i<M;i++)            for(int j=0;j<N;j++)            scanf("%d",&m.a[i][j]);        //mtmul(m,m);        //mtPow(m,3);           for(int i=0;i<M;i++)            for(int j=0;j<N;j++)                printf("%d%c",n.a[i][j],j==N-1?'\n':' ');       return 0;}
原创粉丝点击