解行列式

来源:互联网 发布:iphone免费解压缩软件 编辑:程序博客网 时间:2024/04/29 09:15
这是我刚开学不久写的解行列式的算法,原理很简单,就是将行列式按行、列展开计算。


#include <iostream>

using std::cin;
using std::cout;

template <class T>
void input(int &d,T** &m)
{
    cout<<"输入维数:";cin>>d;
    m=new T*[d];
    for (int i=0;i<d;i++) m[i]=new T[d];
    cout<<"输入数据:/n";
    for (int i=0;i<d;i++)
        for (int j=0;j<d;j++)
            cin>>m[i][j];
}

template <class T>
T** divide(int d,T** &m,int x,int y)
{
    T** result;
    result=new T*[d-1];
    for (int i=0;i<d-1;i++) result[i]=new T[d-1];
    for (int i1=0,i2=0;i1<d;i1++,i2++)
        for (int j1=0,j2=0;j1<d;j1++,j2++)
        {
            if (x==i1) i1++; if (i1>=d) break;
            if (y==j1) j1++; if (j1>=d) break;
            result[i2][j2]=m[i1][j1];
        }
    return result;
}

template <class T>
T solve(int d,T** m)
{
    T result=0;
    if (d==2) result=(m[0][0]*m[1][1]-m[1][0]*m[0][1]);
    else
        for (int i=0;i<d;i++)
            if(i%2!=0)result-=m[0][i]*solve(d-1,divide(d,m,0,i));
            else result+=m[0][i]*solve(d-1,divide(d,m,0,i));
    return result;

    for (int i=0;i<d;i++) delete[] m[i];
    delete[] m; //先前根本就忘了删除,竟然没人提醒我一下,厚道啊!!!!

}

/*
void debug()
{
    int **l;
    l=new int*[4];
    for (int i=0;i<4;i++) l[i]=new int[4];
    for (int i=0;i<4;i++) for (int j=0;j<4;j++) l[i][j]=j;
    cout<<solve(4,l);
}
*/

void cacl()
{

    double** x; //可以变
    int d;
    input(d,x);
    cout<<"答案:"<<solve(d,x)<<"/n";
}

int main()
{
    //debug();
    char ans;
    do
    {
        cacl();
        cout<<"要继续吗?(Y:yes / N:no) ";
        cin>>ans;
    } while(ans=='y'||ans=='Y');
    cin.get();
    cin.get();
    return 0;
}

原创粉丝点击