哎哟那个嘿


私信TA

用户名:657046415

访问量:4769

签 名:

等  级
排  名 8279
经  验 1201
参赛次数 0
文章发表 13
年  龄 0
在职情况 学生
学  校 肇庆学院
专  业

  自我简介:

解题思路:  每次都只计算目标矩阵的一个位置:a[i][j] = c[k][1]*b[k][j]  (K的范围为 1 到 M,我这里矩阵的0号位置不用)

                由于我们的M可能大于,我采用的是逐步上升的求法,先求M=2,再在这基础上继续求


注意事项: 要特别注意的就只当M=0时,矩阵是一个单位矩阵(对角线为1,其余为0),

                再求M=3的时候其实是将M=2的乘以M=1的,所以我们需要保存刚开始输入的M=1的矩阵。



代码分解:

(1)定义的第一个函数:求某个位置幂上升一次的值

int add(int i,int j,int a[31][31],int b[31][31],int N){ //就是求你要的i行j列这个位置的“幂再上升一次”的值
	
	int c=0;
	for (int k=1;k<=N;k++){
		c+=a[i][k]*b[k][j];
	}
	return c;
}

(2)矩阵复制函数:因为我们这里有两处需要保留原来的矩阵

void cove(int c[31][31],int a[31][31],int N){
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			c[i][j]=a[i][j];
		}
	}
	
}

(3)主函数:

int main()
{
	int a[31][31],b[31][31],c[31][31];
	int N,M;
	cin>>N>>M;
	
	for(int i=1;i<=N;i++){
		for(int j=1;j>a[i][j];
		}
	}
	cove(b,a,N);//用矩阵b保留我们刚开始的矩阵a,在我们M>2的情况下需要使用
	
	int k=2;
	while(k<=M){

		if(k==2){ 
			for(int i=1;i<=N;i++){
				for(int j=1;j<=N;j++){	
					a[i][j]=add(i,j,b,b,N);
				}
			}
		}
		else
		{
			cove(c,a,N);               // 重点,为什么需要这一步,为什么下面不直接a[i][j]=add(i,j,a,b,N)。
			                //因为在下面的两个for循环下矩阵a正在逐渐改变,所以我们需要保留原来的
			for(int i=1;i<=N;i++){
				for(int j=1;j<=N;j++){	
					a[i][j]=add(i,j,c,b,N);
				}
			}
		}
		k++;
	}


完整参考代码:

#include<iostream>
using namespace std;
int add(int i,int j,int a[31][31],int b[31][31],int N){
	
	int c=0;
	for (int k=1;k<=N;k++){
		c+=a[i][k]*b[k][j];
	}
	return c;
}
void cove(int c[31][31],int a[31][31],int N){
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			c[i][j]=a[i][j];
		}
	}
	
}
int main()
{
	int a[31][31],b[31][31],c[31][31];
	int N,M;
	cin>>N>>M;
	
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			cin>>a[i][j];
		}
	}
	cove(b,a,N);
	int k=2;
	while(k<=M){

		if(k==2){
			for(int i=1;i<=N;i++){
				for(int j=1;j<=N;j++){	
					a[i][j]=add(i,j,b,b,N);
				}
			}
		}
		else{
			cove(c,a,N);
			for(int i=1;i<=N;i++){
				for(int j=1;j<=N;j++){	
					a[i][j]=add(i,j,c,b,N);
				}
			}
		}
		k++;
	} 
	
	if(M){
		for(int i=1;i<=N;i++){
			for(int j=1;j<=N;j++){
				cout<<a[i][j]<<" ";
				if(j==N) cout<<endl;
				}
		}
	}
	if(!M) 
	{
		for(int i=1;i<=N;i++){
			for(int j=1;j<=N;j++){
				if(i==j) cout<<1<<" ";
				if(i!=j) cout<<0<<" ";
				if(j==N) cout<<endl;
				}
		}
	}
	
	return 0;
 }


 

0.0分

1 人评分

  评论区