2068 - 行列式

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

给你一个n*n的行列式,求行列式的值。

题目输入

多组数据,输入到文件末尾结束。

每组数据先输入一个n,然后输入n行,每行n个数字(1<=n<=9),数据保证每个数字的绝对值都不会超过10。


题目输出

对应每组输入,输出行列式的值。

输入/输出样例

输入格式

1
2

2
-1 2
2 -1

3
1 2 3
2 3 1
3 2 1

输出格式

2
-3
-12

C++解答

#include<stdio.h>
#include<string.h>


int n;
int s[10][10];

int main()
{
   // freopen("1.txt","r",stdin);
   // freopen("2.txt","w",stdout);
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                scanf("%d",&s[i][j]);

        long long mul=1;
        for(int i=0;i<n;i++)
        {
            if(s[i][i]==0)
            {
                int tag=1;
                for(int j=i+1;j<n;j++)
                {
                    if(s[j][i]!=0)
                    {
                        for(int k=0;k<n;k++)
                        {
                            int t=s[i][k];
                            s[i][k]=s[j][k];
                            s[j][k]=t;
                        }
                        tag=0;
                        break;
                    }
                }
                if(tag) continue;
                mul*=-1;//½»»»Á½ÐÐ,·ûºÅ±äºÅ
            }

            for(int j=i+1;j<n;j++)
            {
                if(s[j][i]!=0)
                {
                    long long Lcm=s[i][i]*s[j][i];
                    long long a=Lcm/s[i][i];
                    long long b=Lcm/s[j][i];
                    mul*=b;
                    for(int k=0;k<n;k++)    //  | k*aij | == k*| aij |
                    {
                        s[j][k]*=b;
                    }
                    for(int k=i;k<n;k++)
                    {
                        s[j][k]-=s[i][k]*a;
                    }
                }
            }
  /*         for(int ii=0;ii<n;ii++)
            {
                for(int jj=0;jj<n;jj++)
                {
                    printf("%d ",s[ii][jj]);
                }printf("\n");
          }*/

        }

        long long ans=1;
        for(int i=0;i<n;i++)
            ans*=s[i][i];
        printf("%lld\n",ans/mul);
    }
}

Java解答

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.*;

public class Main{
    public static long gcd(long a,long b){
        if(b==0)    return a;
        return gcd(b,a%b);
    }
    public static long lcm(long a,long b){
        return a/gcd(a,b)*b;
    }
    public static void main(String args[]){
        Scanner cin=new Scanner(System.in);
        long x[][]=new long[10][10];
        int n;
        while(cin.hasNext()){
            n=cin.nextInt();
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    x[i][j]=cin.nextLong();
            long tmp,p,q;
            long ans=1,cnt=1;
            for(int i=1;i<n;i++){
                if(x[i][i]==0){
                    ans*=-1;
                    boolean ok=false;
                    for(int j=i+1;j<=n;j++){
                        if(x[j][i]!=0){
                            ok=true;
                            for(int k=1;k<=n;k++){
                                tmp=x[i][k];
                                x[i][k]=x[j][k];
                                x[j][k]=tmp;
                            }
                        }
                        if(ok)
                            break;
                    }
                }
                ans*=x[i][i];
                for(int j=i+1;j<=n;j++){
                    if(x[j][i]==0)
                    {
                        continue;
                    }
                    //tmp=lcm(x[j][i],x[i][i]);
                    tmp=x[j][i]*x[i][i];
                    p=tmp/x[j][i];
                    q=tmp/x[i][i];

                    for(int k=i;k<=n;k++)
                        x[j][k]=x[j][k]*p-q*x[i][k];
                    cnt*=p;
                }
            }
            /*for(int ii=1;ii<=n;ii++){
                for(int jj=1;jj<=n;jj++)
                    System.out.print(x[ii][jj]+" ");
                System.out.println();
            } */
            ans*=x[n][n];
            System.out.println(ans/cnt);
        }
    }
}