Gauss template

learn from kuangbin

``````#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxn = 50;
int a[maxn][maxn]; // zeng guang
int x[maxn] ; // ans_x
int free_x[maxn] ;
// 8 6 (6,2) (2,0)
inline int gcd(int a , int b) {
return b == 0 ? a : gcd(b,a%b) ;
/*int t ;
while(b){
t = b ;
b = a%b ;
a = t ;
}
return a;*/
}
inline int lcm(int a ,int b){
return a/gcd(a,b)*b;
}
inline int abs(int a ){
return a > 0 ? a : -a;
}
void debug(int equ , int var){
for(int i = 0 ; i < equ ; ++i){
for(int j = 0 ;j <= var ; ++j){
cout << a[i][j] << " " ;
}
cout << endl;
}
}
int Gauss(int equ , int var) {
int max_r ;
for(int i = 0 ; i <= var ; ++i){
free_x[i] = false ;
x[i] = 0 ;
}
//cout << equ << " " << var << endl;
int row , col ;
for(row = 0 ,col = 0 ; row < equ && col < var ; ++row , ++col) {
max_r = row ;
for(int i = row+1 ; i < equ ; ++i){         // find the max element in this col
if(abs(a[max_r][col]) < abs(a[i][col])) max_r = i;
}
if(max_r != row){
for(int j = col ; j <= var ; ++j){  // change
swap(a[max_r][j],a[row][j]) ;
}
}
if(!a[row][col]) {                  // 0
row--;
continue ;
}
//debug(3,3) ;
for(int i = row+1 ; i < equ ; ++i){
if(a[i][col]){// sub a[i][col] -> 0

int tmp = lcm(abs(a[i][col]),abs(a[row][col])) ;
int up = tmp/(abs(a[row][col])) ;
int down = tmp/(abs(a[i][col])) ;
//cout << tmp << " " << up << " " << down << endl;
if(a[i][col]*a[row][col]<0) up = -up ;
for(int j = col ; j <= var; ++j){
a[i][j] = a[i][j]*down - a[row][j]*up ;
}
}
}
//system("pause") ;
}
// col == var  , [row,equ) == 皆是0000...an
for(int i = row ; i < equ ; ++i){
if(a[i][col] != 0) {
return -1 ;         // no solve
}
}
if(row < var){ //[row , equ -1 ] -> (000.000)  have free_x ,at least var - row . cal the x[]
int free_index ;
for(int i = row-1; i >= 0; --i){
int free_num = 0 ;
for(int j = i; j < var; ++j){
if(a[i][j]&&(!free_x[j])) {
free_num++ ;
free_index = j ;
}
}
if(free_num > 1) continue ; // free_x > 1 , can't solve
// solve the free__index;
int tmp = a[i][var] ;
for(int j = i ; j < var ; ++j){
if(a[i][j] && j != free_index) {
tmp -= a[i][j]*x[j] ;
}
}
x[free_index] = tmp/a[i][free_index] ;      // solve the x of a[i][free_index] ;
free_x[free_index] = true ;                 // solvable
}
return var - row ;
}
// only have one ans and must be the ans
for(int i = equ-1 ; i >= 0 ; --i){
int tmp = a[i][var] ;
for(int j = i+1 ; j < var ; ++j){
if(a[i][j])
tmp -= a[i][j]*x[j] ;
}
// if(tmp%a[i][i] != 0 ) have the ans of double type
x[i] = tmp/a[i][i] ;
}
return 0;
}
int main(){
int t ;
cin >> t ;
while(t--){
int equ , var ;
cin >> equ >> var ;
for(int i = 0 ;i < equ ; ++i){
for(int j = 0; j <= var ; ++j){
cin >> a[i][j] ;
}
}
int tmp = Gauss(equ,var);
if(tmp == -1 ) cout << "can't solve the question" << endl;
else if(tmp == 0) cout << "there is only ans " << endl;
else cout << "there have lots of ans" << endl;
if(!tmp) {
for(int i = 0 ;i < var ; ++i){
cout << "x" << i << "is " << x[i] << endl ;
}
}
}
/*
5
3 3
2 1 -1 8
0 1 1 2
0 2 1 5
x = 2 , y = 3  , z = -1
*/
return 0;
}
``````

• 本文已收录于以下专栏：

hdu 1588 Gauss Fibonacci （矩阵）

Gauss Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)...
• clover_hxy
• 2016年05月22日 20:09
• 263

HDU 1588 Gauss Fibonacci（矩阵快速幂+二分等比序列求和）

HDU 1588 Gauss Fibonacci（矩阵快速幂+二分等比序列求和） ACM 题目地址：HDU 1588 Gauss Fibonacci 题意：  g(i)=k*i+b...
• hcbbt
• 2014年08月05日 01:10
• 2330

Gauss–Seidel迭代 + Jacobi迭代

• wwanrong
• 2017年12月28日 22:14
• 101

Gauss

然后自己根据CROUT代码编写了GAUSS消元法，这个比CROUT简单点，首先消除了所有的语法错误，现在把C++学好了，基本这样的代码页就没有什么大的语法错误了，很容易就搞定了 但是结果却不正确，自...
• collapsar_feel
• 2006年12月04日 22:20
• 749

Gauss–Seidel方法和Jacobi 方法

Gauss–Seidelmethod 对应于形如Ax = b的方程（A为对称正定矩阵或者Diagonally dominant），可求解如下：         Jacobi method 另一种方法是...
• wangxiaojun911
• 2011年10月20日 12:57
• 8409

Gauss-Newton algorithm

function [x,minf] = minGN(f,x0,var,eps) format long; if nargin == 3 eps = 1.0e-6; end S = transp...
• tanmengwen
• 2015年06月12日 16:04
• 921

[POJ 1588] Gauss Fibonacci （矩阵快速幂）

• zichenzhiguang
• 2016年09月30日 14:12
• 156

Gauss消去法解线性方程组（Matlab）

clear;clc; % Gauss消去法解线性方程组 A=[3 -5 6 4 -2 -3 8;        1 1 -9 15 1 -9 2;     2 -1 7 5 -1 6 11;...
• zhangchao3322218
• 2011年09月18日 21:59
• 2715

Gaussian安装手册 v1.02

一、            背景介绍Gaussian是目前计算化学领域内最流行、应用范围最广的商业化量子化学计算程序包。它最早是由美国卡内基梅隆大学的约翰·波普（John A Pople,  19...
• Tobeabetterman_He
• 2009年08月20日 10:38
• 3654