2068 - 行列式
时间限制 : 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); } } }