java 实现高斯消元_java高斯消元模板

//package fuc;

importjava.io.PrintStream;importjava.math.BigInteger;importjava.util.Scanner;public classMain {public static voidmain(String[] args) {newTask().main();

}

}classfrac{

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 newfrac(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 newfrac(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 newfrac(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 newfrac(p, q);

}

frac abs() {return newfrac(a.abs(), b.abs());

}intcompareTo(frac t) {

t= this.sub(t);returnt.a.compareTo(BigInteger.ZERO);

}booleanzero() {returna.equals(BigInteger.ZERO);

}

}classTask{

Scanner cin= newScanner(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=newfrac(ZERO,ONE);

frac r,one=newfrac(ONE,ONE);boolean gauss(intn){inti,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;

}voidmain(){intn,i,j;while(cin.hasNext()){

n=cin.nextInt();for (i=1; i<= n; ++i){for (j=1; j<=n; ++j){

a[i][j]=newfrac(cin.nextBigInteger(),ONE);

}

x[i]=newfrac(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();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值