zoukankan      html  css  js  c++  java
  • 高斯消元 Java 高精度版 HDU 2449 Gauss Elimination

    http://acm.hdu.edu.cn/showproblem.php?pid=2449

    题意 :

     纯高斯消元 ;

    输入  n 行 ,每行  n+1个数带代表 系数和 值  

    ai1,ai2,ai3…..ain, bi

    ai1*x1+ai2*x2+......ain*xn=bi

    求解  xi  若没有整数解 输出 分数 ,

    若没有解 输出  

    No solution.
     

    copy 别人的 高精度 Gauss (留着用)(不会java 啊


      1 import java.util.*;
      2 import java.math.*;
      3 
      4 class fraction{
      5     BigInteger a, b;
      6     public fraction(){ 
      7         a = new BigInteger("0");
      8         b = new BigInteger("1");
      9     }
     10     
     11     fraction( BigInteger a0, BigInteger b0){
     12         this.a = a0; this.b = b0;
     13     }
     14     void reduction(){
     15         BigInteger tmp = a.gcd( b );
     16         a = a.divide( tmp );
     17         b = b.divide( tmp );
     18         if( b.compareTo( BigInteger.ZERO ) == - 1 )
     19         {
     20             b = b.multiply( BigInteger.valueOf( -1 ));
     21             a = a.multiply( BigInteger.valueOf( -1 ));
     22         }
     23     }
     24     fraction add( fraction t ){
     25         fraction tmp = new fraction( a.multiply( t.b ).add( b.multiply( t.a )) , b.multiply(t.b) );
     26         tmp.reduction();
     27         return tmp;
     28     }
     29     fraction sub( fraction t ){
     30         fraction tmp = new fraction( a.multiply( t.b ).subtract( b.multiply( t.a )) , b.multiply(t.b) );
     31         tmp.reduction();
     32         return tmp;
     33     }
     34     fraction mult( fraction t){
     35         fraction tmp = new fraction( a.multiply( t.a ), b.multiply( t.b ));
     36         tmp.reduction();
     37         return tmp;
     38     }
     39     fraction div( fraction t){
     40         fraction tmp = new fraction( a.multiply( t.b ), b.multiply( t.a ));
     41         tmp.reduction();
     42         return tmp;
     43     }
     44     public void abs(){
     45         ifthis.a.compareTo( BigInteger.ZERO ) == - 1 ){
     46             this.a = this.a.multiply( BigInteger.valueOf( -1 ));
     47         }
     48     }
     49     void out(){
     50         this.reduction();
     51         if( b.compareTo( BigInteger.ONE ) == 0 )
     52             System.out.println(a);
     53         else
     54             System.out.println(a+"/"+b);
     55     }
     56     
     57     boolean biger( fraction p ){
     58         fraction tmp = new fraction ( a, b );
     59         fraction t = new fraction(p.a,p.b);
     60         //t = p;
     61         tmp.reduction();
     62         if( tmp.a.compareTo( BigInteger.ZERO ) == - 1 ){
     63             tmp.a = tmp.a.multiply( BigInteger.valueOf( -1 ));
     64         }
     65         if( t.a.compareTo( BigInteger.ZERO ) == - 1 ){
     66             t.a = t.a.multiply( BigInteger.valueOf( -1 ));
     67         }
     68         tmp = tmp.sub( t );
     69         return tmp.a.compareTo( BigInteger.ZERO ) > -1;
     70     }
     71     
     72 }
     73 
     74 public class Main{
     75 
     76     public static void lup_solve( fraction x[],fraction y[], fraction L[][], fraction U[][],int pi[],fraction b[],int n)
     77     {
     78         int i, j;
     79         fraction z = new fraction( BigInteger.ZERO , BigInteger.ONE);
     80         fraction sum = z;//double sum;
     81         for ( i = 0 ; i < n ; i ++ ){
     82             sum = z; //sum = 0;
     83             for ( j = 0 ; j < i ; j ++ ){
     84                 sum = sum.add( L[i][j].mult( y[j] ));//sum += L[i][j] * y[ j ];
     85             }
     86             y[i] = b[ pi[i] ].sub( sum );//y[i] = b[ pi[i] ] - sum;
     87         }
     88         for ( i = n - 1 ; i >= 0 ; i -- ){
     89             sum = z ; //sum = 0;
     90             for ( j = i + 1 ; j < n ; j ++ ){
     91                 sum = sum.add( U[i][j].mult( x[j] ));//sum += U[i][j] * x[ j ];
     92             }
     93             x[i] = (y[i].sub( sum )).div( U[i][i] );//x[i] = (y[i] - sum)/U[i][i];
     94         }
     95     }
     96     
     97     public static int lup_decomposition( fraction a[][] , int n , int pi[] )
     98     {
     99         int i, j, k, k1 = 0 ;
    100         fraction p = new fraction(BigInteger.valueOf(0), BigInteger.ONE ), z = new fraction( BigInteger.valueOf(0), BigInteger.ONE );
    101         for ( i = 0 ; i < n ; i ++ )
    102             pi[i] = i;// 置换
    103             
    104         for ( k = 0 ; k < n ; k ++ ){
    105             p = z;
    106             for ( i = k ; i < n ; i ++ )
    107             {
    108                 if(  a[i][k].biger( p ) )
    109                 {
    110                     p = new fraction( a[i][k].a,a[i][k].b) ;
    111                     k1 = i;
    112                 }
    113             }
    114             if( p.a.compareTo( BigInteger.ZERO ) == 0 ){
    115                 return 0 ;// error
    116             }
    117             fraction tmp;
    118             
    119             int t = pi[ k ]; pi[ k ] = pi[ k1 ]; pi[k1] = t;
    120             for ( i = 0 ; i < n ; i ++ ){
    121                 tmp = a[ k ][i];  a[ k ][i] = a[ k1 ][i];  a[k1][i] = tmp;
    122             }//swap( a[k][i], a[k1][i] );
    123             for ( i = k + 1 ; i < n ; i ++ )
    124             {
    125                 a[i][k] = a[i][k].div( a[k][k] );
    126                 for ( j = k + 1 ; j < n ; j ++ )
    127                     a[i][j] = a[i][j].sub( a[i][k].mult(a[k][j]));// - a[i][k] * a[k][j] ;
    128             }
    129         }
    130         return 1;
    131     }
    132     
    133     public static void check(fraction a[][], fraction x[], int n){
    134         int i, j;
    135         fraction sum, z = new fraction( BigInteger.ZERO , BigInteger.ONE);
    136         for ( i = 0 ;  i < n ; i++ ){
    137             sum = z;
    138             for ( j = 0 ;j < n ; j ++ )
    139             {
    140                 sum = sum.add( a[i][j].mult( x[j] ));
    141             }
    142             sum.out();
    143         }
    144     }
    145     
    146     public static void main(String[] agrs){
    147         Scanner cin = new Scanner( System.in );
    148         int i, j;
    149         int n;
    150         while( cin.hasNextInt() )
    151         {
    152             //任何函数都要和一个class相连
    153             n = cin.nextInt();
    154             int pi[] = new int[n];
    155             fraction a[][] = new fraction[n][n];
    156             fraction aa[][] = new fraction[n][n];
    157             fraction B[] = new fraction[n];
    158             fraction x[] = new fraction[n];
    159             fraction y[] = new fraction[n];
    160             
    161             for ( i = 0 ; i < n ; i ++ )
    162             {
    163                 for ( j = 0 ;j < n ; j ++ ){
    164                     a[i][j] = new fraction( BigInteger.valueOf(0),BigInteger.valueOf(1));
    165                     a[i][j].a = cin.nextBigInteger();
    166                     aa[i][j] = new fraction( BigInteger.valueOf(0),BigInteger.valueOf(1));
    167                     aa[i][j] = a[i][j];
    168                 }
    169                 B[i] = new fraction( BigInteger.valueOf(0),BigInteger.valueOf(1));
    170                 B[i].a = cin.nextBigInteger();
    171                 x[i] = new fraction( BigInteger.valueOf(0),BigInteger.valueOf(1));
    172                 y[i] = new fraction( BigInteger.valueOf(0),BigInteger.valueOf(1));
    173             }
    174             if1 == lup_decomposition( a, n, pi) )
    175             {
    176                 lup_solve( x, y, a, a, pi, B, n);
    177                 for ( i = 0 ;i < n; i ++)
    178                     x[i].out();
    179                 //check( aa, x, n);
    180             }
    181             else
    182             {
    183                 System.out.println("No solution.");
    184             }
    185             System.out.println();
    186         }
    187     }
    188 }
  • 相关阅读:
    ios界面布局整理
    android ProGuard 代码混淆实现
    mac版 android破解软件下载安装
    在unix系统下的 .o文件 .a文件 .so文件说明和相互关系
    android中的广播接收实现总结
    用java的jdk 生成android 的jni接口文档
    Android 自定义Application
    android项目中配置NDK自动编译生成so文件
    创建android Notification
    (ios) nsnotification总结
  • 原文地址:https://www.cnblogs.com/acSzz/p/2662436.html
Copyright © 2011-2022 走看看