|
import java.util.*;import java.math.*;class fraction{//分数类 BigInteger a, b;//a/b,b>0; fraction(){//构造函数1 a = new BigInteger("0"); b = new BigInteger("1"); } fraction(BigInteger val){//构造函数2 a = new BigInteger(val.toString()); b = new BigInteger("1"); } fraction(String a){ this.a=new BigInteger(a); this.b=new BigInteger("1"); } fraction( BigInteger a0, BigInteger b0){//构造函数3 this.a = a0; this.b = b0; this.reduction(); } fraction(String a,String b){ this.a=new BigInteger(a); this.b=new BigInteger(b); this.reduction(); } fraction( fraction other){ this.a=new BigInteger(other.a.toString()); this.b=new BigInteger(other.b.toString()); } void reduction(){//化简 BigInteger tmp = a.gcd( b );//其值是 abs(a) 和 abs(b) 的最大公约数。 a = a.divide( tmp ); b = b.divide( tmp ); if( b.compareTo( BigInteger.ZERO ) == - 1 ) { b = b.multiply( BigInteger.valueOf( -1 )); a = a.multiply( BigInteger.valueOf( -1 )); } } fraction add( fraction t ){//加一个 fraction tmp = new fraction( a.multiply( t.b ).add( b.multiply( t.a )) , b.multiply(t.b) ); tmp.reduction(); return tmp; } fraction sub( fraction t ){//减 fraction tmp = new fraction( a.multiply( t.b ).subtract( b.multiply( t.a )) , b.multiply(t.b) ); tmp.reduction(); return tmp; } fraction mult( fraction t){//乘 fraction tmp = new fraction( a.multiply( t.a ), b.multiply( t.b )); tmp.reduction(); return tmp; } fraction div( fraction t){//除 fraction tmp = new fraction( a.multiply( t.b ), b.multiply( t.a )); tmp.reduction(); return tmp; } fraction abs(){ fraction tmp=new fraction(this); tmp.a=tmp.a.abs(); return tmp; } void show(){ this.reduction(); if( b.compareTo( BigInteger.ONE ) == 0 ) System.out.println(a); else System.out.println(a+"/"+b); } boolean Biger( fraction p ) { return this.sub(p).a.compareTo(BigInteger.ZERO)==1; } int zero() { this.reduction(); return this.a.compareTo(BigInteger.ZERO); }}public class Main{ public static void main(String args[]){ /*2x1+2x2-x3=6 * x1-2x2+4x3=4 *5x1+7x2+x3=28 */ fraction a[][]={{ new fraction("2"),new fraction("2"),new fraction("-1")}, { new fraction("1"),new fraction("-2"),new fraction("4")}, { new fraction("5"),new fraction("7"),new fraction("1")}}; fraction b[]={new fraction("6"),new fraction("3"),new fraction("28")}; gauss_cpivot(3,a,b); for(int i=0;i< 3;i++){ b.show(); } } static boolean gauss_cpivot(int n,fraction a[][],fraction b[]) {//高斯消元法解方程组,有唯一解返回true,结果放在b[]中,否则返回false int i,j,k,row=0; for(k=0;k< n;++k) { fraction maxp=new fraction(); for(i=k;i< n;++i) if(a[k].abs().Biger(maxp.abs())) { row=i; maxp=new fraction(a[k]); } if(maxp.abs().zero()==0)return false; if(row!=k) { for(j=k;j< n;++j) { fraction t=new fraction(a[k][j]); a[k][j]=a[row][j]; a[row][j]=t; } fraction t=new fraction(b[k]); b[k]=b[row]; b[row]=t; } for(j=k+1;j< n;++j) { a[k][j]=a[k][j].div(maxp); for(i=k+1;i< n;++i) a[j]=a[j].sub(a[k].mult(a[k][j])); } b[k]=b[k].div(maxp); for(i=k+1;i< n;++i) b=b.sub(b[k].mult(a[k])); } for(i=n-1;i>=0;--i) for(j=i+1;j< n;++j) b=b.sub(b[j].mult(a[j])); return true; } }[/pre]
运行:
1
3
2 |
|