zoukankan      html  css  js  c++  java
  • java高斯消元模板

    //package fuc;
    
    import java.io.PrintStream;
    import java.math.BigInteger;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            new Task().main();
        }
    }
    class frac{
        BigInteger a,b;
        frac(){
            a=BigInteger.ZERO;
            b=BigInteger.ONE;
        }
        frac(BigInteger a,BigInteger b){
            this.a=a;
            this.b=b;
        }
        frac sub(frac t){
            BigInteger p, q, d;
            p = a.multiply(t.b);
            p = p.subtract(t.a.multiply(b));
            q = b.multiply(t.b);
            d = p.gcd(q);
            p = p.divide(d);
            q = q.divide(d);
            return new frac(p, q);
        }
        frac add(frac t){
            BigInteger d, p, q;
            p = a.multiply(t.b);
            p = p.add(t.a.multiply(b));
            q = b.multiply(t.b);
            d = p.gcd(q);
            p = p.divide(d);
            q = q.divide(d);
            return new frac(p, q);
        }
        frac div(frac t) {
            BigInteger p, q, d;
            p = a.multiply(t.b);
            q = b.multiply(t.a);
            d = p.gcd(q);
            p = p.divide(d);
            q = q.divide(d);
            return new frac(p, q);
        }
        frac mul(frac t) {
            BigInteger p, q, d;
            p = a.multiply(t.a);
            q = b.multiply(t.b);
            d = p.gcd(q);
            p = p.divide(d);
            q = q.divide(d);
            return new frac(p, q);
        }
        frac abs() {
            return new frac(a.abs(), b.abs());
        }
        int compareTo(frac t) {
            t = this.sub(t);
            return t.a.compareTo(BigInteger.ZERO);
        }
        boolean zero() {
            return a.equals(BigInteger.ZERO);
        }
    }
    class Task{
        
        Scanner cin = new Scanner(System.in);
        PrintStream cout = System.out;
        BigInteger ONE= BigInteger.ONE;
        BigInteger ZERO=BigInteger.ZERO;
        frac[][] a = new frac[211][211];
        frac[] x = new frac[211];
        frac t;
        frac zero=new frac(ZERO,ONE);
        frac r,one =new frac(ONE,ONE);
        boolean gauss(int n){
            int i,j,k,row;
            for(i=1;i<=n;i++){
                row=i;
                for (j=i+1;j<=n;j++){
                    if (a[row][i].abs().compareTo(a[j][i].abs())<0){
                        row = j;
                    }
                }
                if (a[row][i].compareTo(zero)==0){
                    return false;
                }
                if (row!=i){
                    for (k=i;k<=n;k++){
                        t=a[row][k];
                        a[row][k]=a[i][k];
                        a[i][k]=t;
                    }
                    t=x[row];
                    x[row]=x[i];
                    x[i]=t;
                }
                for (j=i+1;j<=n;j++){
                    r=a[j][i].div(a[i][i]);
                    a[j][i]=zero;
                    for (k=i+1;k<=n;k++){
                        a[j][k]=a[j][k].sub(r.mul(a[i][k]));
                    }
                    x[j]=x[j].sub(r.mul(x[i]));
                }
            }
            for (i=n;i>=1;i--){
                for (j=i-1;j>=1;j--){
                    r=a[j][i].div(a[i][i]);
                    a[j][i]=zero;
                    x[j]=x[j].sub(r.mul(x[i]));
                }
            }
            for (i=1;i<=n;i++){
                x[i]=x[i].div(a[i][i]);
            }
            return true;
        }
        
        void main(){
            int n,i,j;
            while(cin.hasNext()){
                n = cin.nextInt();
                for (i=1; i<= n; ++i){
                    for (j=1; j<=n; ++j){
                        a[i][j]=new frac(cin.nextBigInteger(),ONE);
                    }
                    x[i]=new  frac(cin.nextBigInteger(),ONE);
                }
                if (!gauss(n)){
                    cout.println("No solution.");
                }
                else{
                    for (i=1;i<=n;i++){
                        if (x[i].b.compareTo(ZERO)<0){
                            x[i].a=x[i].a.negate();
                            x[i].b=x[i].b.negate();
                        }
                    }
                    for (i=1;i<=n;i++){
                        cout.print(x[i].a);
                        if (x[i].b.compareTo(ONE)!=0){
                            cout.print("/"+x[i].b);
                        }
                        cout.println();
                    }
                }
                cout.println();
            }
        }
        
    }

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2449

  • 相关阅读:
    【转】Linux世界驰骋——文件系统和设备管理
    【转】Linux的inode的理解
    【转】名企HR教你如何过网申
    【转】Unix的文件系统的内部结构,主要是超级块、inode相关知识
    【转】Unix系统的心脏Unix文件系统
    【转】Unix环境高级程序设计入门文件系统的相关编程(上)
    【转】电驴提示“该内容尚未提供权利证明,无法提供下载”之解决办法详解
    【转】第三节 UNIX文件系统结构
    测试网站各项性能的31 个免费在线工具 (转)
    恋爱
  • 原文地址:https://www.cnblogs.com/ztdf123/p/11436646.html
Copyright © 2011-2022 走看看