高斯消元 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 }

 

转载于:https://www.cnblogs.com/acSzz/archive/2012/08/29/2662436.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值