回 帖 发 新 帖 刷新版面

主题:[原创]求N阶方阵的n次方

上次的程序修正过了,现在可以实现了。

#include<iostream>
using namespace std;
#define N 3
class Matrix
{
    int m[N][N];
public:
    Matrix();
    Matrix(int init);
    void print();
    friend Matrix operator *(Matrix ma,Matrix mb);
    friend Matrix operator ^(Matrix mat,int n);
};
Matrix::Matrix()
{
    int i,j;
    for(i=0;i<N;++i)
        for(j=0;j<N;++j)
            cin>>m[i][j];
}
Matrix::Matrix(int init)
{
    int i,j;
    for(i=0;i<N;++i)
        for(j=0;j<N;++j)
            m[i][j]=init;
}
void Matrix::print()
{
    int i,j;
    for(i=0;i<N;++i)
    {
        for(j=0;j<N;++j)
            cout<<m[i][j]<<'\t';
        cout<<endl;
    }
}
Matrix operator *(Matrix ma,Matrix mb)
{//两个方阵相乘
    int i,j,k;
    Matrix result(0);
    for(i=0;i<N;++i)
        for(j=0;j<N;++j)
            for(k=0;k<N;++k)
                result.m[i][j]=result.m[i][j]+ma.m[i][k]*mb.m[k][j];
    return result;
}
Matrix operator ^(Matrix mat,int n)
{//方阵的n次
    Matrix result(0);
    result=mat;
    for(int i=0;i<n-1;++i)
        result=result*mat;
    return result;
}
void main()
{//求N阶方阵的n次方
    int n;
    cout<<"n=";
    cin>>n;
    cout<<N<<"阶方阵为:"<<endl;
    Matrix matrix,result(0);
    result=matrix^n;
    cout<<"已知的"<<N<<"阶方阵的"<<n<<"次方为:"<<endl;
    result.print();
}

回复列表 (共3个回复)

沙发

这样的做法只是在方阵阶数比较小,而且他的方次也比较小的时候才有用。如果一个1024*1024的方阵要算1000次方,那这种算法就死了。

而且,事实上,就算这种做法,乘法的算法也有很大的改进余地。

板凳

这是我在书上学到的
不知道对你有帮助没有  它的时间复杂度为logn
#include <math.h>
#include <stdio.h>
long double po(long int x, long int n);

main()
{int x;
int n;
long double po(long int x,long int n);
printf("请输入X的值:\n");
scanf("%d",&x);
printf("请输入N的值:\n");
scanf("%d",&n);
printf("结果是:%e\n", po(x,n));
}


long double po(long int x, long int n)
{
if (n==0)
return 1;
if (n==1)
  return x;
  if (n%2 ==0)
   return po(x*x,n/2);
    else
     return po(x*x,n/2)*x;
}

3 楼

谢谢大家给我提出宝贵的意见,我会考虑的。

我来回复

您尚未登录,请登录后再回复。点此登录或注册