不是快速幂,只是想写离散作业,随便写的一个幂
#include<iostream>
using namespace std;
int main()
{
int a[100][100];
int b[100][100];
int ans[100][100];
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
b[i][j]=a[i][j];
}
}
m--;
while(m--){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
ans[i][j]=0;
for(int k=1;k<=n;k++){
ans[i][j]+=a[i][k]*b[k][j];
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
b[i][j]=ans[i][j];
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
}
最近我又看到了另一种代码,非常简短
#include<cstdio>
const int maxn = 257;
int n,m;
int a[maxn][maxn],aa[maxn][maxn];
int main()
{
printf("输入点边数n、m
");
scanf("%d%d",&n,&m);
printf("输入边的两点
");
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(x!=y)a[x][y]=a[y][x]=aa[x][y]=aa[y][x]=1;
else a[x][y]=aa[x][y]=2;
}
printf("输入所求次幂
");
int t;
scanf("%d",&t);
while(--t)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int c=0;
for(int k=0;k<n;k++)
{
c+=a[i][k]*aa[k][j];
//printf("%d %d %d
",i,j,c);
}
a[i][j]=c;
}
}
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
printf("%d%c",a[i][j],j+1!=n?' ':'
');
return 0;
}
可惜这个代码存在错误。
错误的原因在于,在计算的过程中,对作为被乘数的矩阵进行了更新,导致计算过程结果偏大