题目描述
输入描述:
第一行:两个整数n(2<=n<=10)、k(1<=k<=5),两个数字之间用一个空格隔开,含义如上所示。 接下来有n行,每行n个正整数,其中,第i行第j个整数表示矩阵中第i行第j列的矩阵元素Pij且(0<=Pij<=10)。另外,数据保证最后结果不会超过10^8。
输出描述:
对于每组测试数据,输出其结果。格式为: n行n列个整数,每行数之间用空格隔开,注意,每行最后一个数后面不应该有多余的空格。
输入
2 2 9 8 9 3
输出
153 96 108 81
分析:
1.这里要模拟矩阵的乘法,用了3层循环模拟乘法,最外一层模拟次幂;
2.这里主要讲一个 ,利用memcpy函数实现数组之间的复制。
void*memcpy(void*dest, const void*src,unsigned int count);
第一个参数是目的数组首地址,即需要赋值的地址。第二个参数是源数组地址,即被复制的数组,第三个参数是复制的字节数。
数组是连续存放的,所以只需要将src的大小字节数作为第三个参数即可。
注意的是第三个参数是字节数大小而不是数组大小,如int a[5] 数组大小是5,但是字节数是5*4=20
通常第三个参数利用sizeof()来提供,即sizeof(src);
代码:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int n,i,j,temp=0,k,t;
cin>>n>>t;
int p[n+1][n+1],q[n+1][n+1];
int res[n+1][n+1];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cin>>p[i][j];
q[i][j]=p[i][j];
res[i][j]=p[i][j];
}
while(t-1!=0)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
for(k=1;k<=n;k++)
{temp += q[i][k] * p[k][j];}
res[i][j]=temp;
temp=0;
}
}
memcpy(q,res,sizeof(res));
t--;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(j!=1)
cout<<" ";
cout<<res[i][j];
}
cout<<endl;
}
return 0;
}