这个题有两种解法,一种是先对矩阵进行%3,然后在3次方循环里判断如果元素如果是0,则continue不进行乘积的累加的结果。能起到优化的作用
还有一种就是对矩阵进行某一个进行转置后,再进行两个矩阵的乘积累加。也能起到优化
参见:http://wenku.baidu.com/link?url=261XeEzH-AZkFGPiN63t1nnojoQF50yiuMoviHroGjVXjjRlxFcvWLcws0jgQcmZo4oA9BJcjnPxVreWRu-XXa9zb6r5gUUTxmBXn_qWSsu&qq-pf-to=pcqq.group点击打开链接
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
int p,q,n;
ll A[805][805],B[805][805],c[805][805];
int main()
{
while(scanf("%d",&n)==1)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&A[i][j]);
A[i][j]=A[i][j]%3;
c[i][j]=0;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&B[i][j]);
B[i][j]=B[i][j]%3;
}
}
/*第二种解法是根据转置后的数据进行行相乘累加的结果。转置后能起到优化的作用。
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
swap(B[i][j],B[j][i]);
}
}
int i,j,k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
c[i][j]+=A[i][k]*B[j][k];
}
}
}*/
for(i = 1; i <= n; ++i) {
// if(A[i][k] == 0) continue; //***
for(j = 1; j <= n; ++j) {
if(A[i][j]==0) continue;//对一个矩阵里的如果是0的元素,则不进行乘
for(k=1;k<=n;++k)
{
//if(A[i][k] == 0||B[j][k]==0) continue; //***
c[i][k] = (c[i][k]+A[i][j] * B[j][k])%3;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
c[i][j]=c[i][j]%3;
if(j==1)
printf("%d",c[i][j]);
else
printf(" %d",c[i][j]);
}
printf("\n");
}
}
return 0;
}