编程实现克拉默法则求值(1)

1、克拉默法则

    含有n个未知数X1,X2,....,Xn 的n个线形方程组:

         a11x1+a12x2+...+a1nxn=b1,                    .....................1

        a21x1+a22x2+...+a2nxn=b2,                    .....................2

       ...

       an1x1+an2xn+...+annxn=bn                    .....................n

   如果线性方程组,中的系数行列式D不等于0,那么该方程具有唯一解。

2、方程解的构成:

     Xi=Di/D   (i =1,2,...,n)

     其中的Di即为:在系数行列式的基础之上,用值组成的列去替换其i列的值

3、编程实现为:

        实现的代码是在上一个实验中求行列式的基础之上来的:

        主要代码为:

     

    int * index;

    double **arr=NULL,**buff=NULL;

    double sum=0;

    int n;

    double *res=NULL;

  

fprintf(stdout, "tells :");

    scanf("%d",&n);

    index=new int[n];

    for(int i=0;i<n;i++)

        index[i]=i;

    res=new double[n];

    for(int i=0;i<n;++i)

    {

        res[i]=0;

    }

    arr=new double *[n+1];

    for(int j=0;j<n;j++)

    {

        arr[j]=new double [n+1];

        fprintf(stdout, "the %d colum value is",j+1);

        for(int k=0;k<n+1;k++)

        {

            scanf("%lf",&arr[j][k]);

        }

    }

    perm(index, 0, n, arr, &sum);

    if(sum==0)

    {

        fprintf(stdout, "now it can't acclute value");

    }

    else

    {

        fprintf(stdout, "the D is %.08lf\n",sum);

        buff=new double *[n];

        //init value from arr

        for(int i=0;i<n;++i)

        {

            buff[i]=new double[n];

            for(int j=0;j<n;j++)

            {

                buff[i][j]=arr[i][j];

            }

        }

        //change i colum value into the n+1 of arr colum value

        for(int i=0;i<n;i++)

        {

            for(int j=0;j<n;j++)

            {

                buff[j][i]=arr[j][n];

            }

            perm(index, 0, n, buff, &res[i]);

            for(int j=0;j<n;j++)

            {

                buff[j][i]=arr[j][i];

            }

        }

        for(int i=0;i<n;i++)

        {

            fprintf(stdout, "the x%d value is :%.08lf\n",i+1,res[i]/sum);

        }

        //free allocated spare

        for(int i=0;i<n;i++)

            free(buff[i]);

    }

    //free allocation

    for(int i=0;i<n+1;++i)

    {

        free(arr[i]);

    }

    free(res);

    free(index);



测试用例为:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值