LETTers练习赛第十场 第二题

矩阵连乘,直接暴力之。因为只要求保留两位小数,函数一定是收敛的。

 

#include<iostream>
using namespace std;
double temp[105][105];
double jiecheng(int n){//不想查阶乘的英文了。
if(n==0)
return 1;
double ans=1;
for(int i=1;i<=n;i++)
ans*=i;
return ans;
}
void Matrix_Muti(double mt[105][105],int n){
int i,j,l,count;
double m,save[105][105],di,ans[105][105];//数很大,double之
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
temp[i][j]=mt[i][j];
if(i==j)
ans[i][j]=1+mt[i][j];//一开始就把单位矩阵和自己加到一起
else
ans[i][j]=mt[i][j];
}
for(count=2;count<=50;count++){//直接算到50次方
di=jiecheng(count);
for(i=1;i<=n;i++){ // i 代表行数
for(l=1;l<=n;l++){// l 代表列数
m=0;
for(j=1;j<=n;j++)// j 代表该行或列的第几个。
       m+=mt[i][j]*temp[j][l];
save[i][l]=m;
}
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
mt[i][j]=save[i][j];
ans[i][j]+=save[i][j]/di;
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
 printf("%.2lf ",ans[i][j]);//输出竟然是这个。
printf("\n");
}
}
int main(){
 double mt[105][105];
int n;
int i,j;
while(scanf("%d",&n)&&n){
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%lf",&mt[i][j]);
Matrix_Muti(mt,n);
}
return 0;
}
posted @ 2012-05-08 18:43  LETTers  阅读(182)  评论(0编辑  收藏  举报