高斯消元模板
2016-11-21 20:18
405 查看
高斯消元求异或方程组
高斯消元解线性方程组
int equ,val;//equ:方程数,val:变元 int a[Max][Max];//增广矩阵 int x[Max];//解集 int free_x[Max];//自由变元 int free_num;//自由变元的个数 int Gauss()//返回-1表示无解;0表示有唯一解,生成解集x[];否则返回自由变元个数 { int max_r,col,k;//max_r:当前列绝对值最大的行;col:当前处理的列 free_num=0; for(k=0,col=0; k<equ&&col<val; k++,col++) { max_r=k; for(int i=k+1; i<equ; i++) { if(abs(a[i][col])>abs(a[max_r][col])) max_r=i; } if(a[max_r][col]==0)//说明col列第k行以下全是0了,则处理当前行的下一列 { k--; free_x[free_num++]=col; continue; } if(max_r!=k)//最大行不是当前行,则与第k行交换 { for(int j=col; j<val+1; j++) swap(a[k][j],a[max_r][j]); } for(int i=k+1; i<equ; i++) { if(a[i][col]!=0)//左列不为0,进行消元运算 { for(int j=col; j<val+1; j++) a[i][j]^=a[k][j]; } } } for(int i=k; i<equ; i++) if(a[i][col]!=0) return -1;//无解 if(k<val) return val-k;//解不唯一,返回解的个数 for(int i=val-1; i>=0; i--) { x[i]=a[i][val]; for(int j=i+1; j<val; j++) x[i]^=(a[i][j]&&x[j]); } return 0; }
高斯消元解线性方程组
int gcd(int a,int b) //返回最大公约数 { int t; while(b!= 0) { t=b; b=a%b; a=t; } return a; } int lcm(int a,int b) //返回最小公倍数 { return a*b/gcd(a,b); } int Gauss(int equ,int var) { int i,j,k,col; int max_r,ta,tb,lcm1; int temp,unuse_x_num,unuse_index; col=0; //设当前处理列的值为0,表示从第1列开始处理 for(k=0;k<equ && col<var;k++,col++) //循环处理矩阵中的行 { max_r=k; //绝对值最大行 for(i=k+1;i<equ;i++) if(abs(arr[i][col])>abs(arr[max_r][col])) max_r=i; //保存绝对值最大的行号 if(max_r!=k) //最大行不是当前行,则与第k行交换 for(j=k;j<var+1;j++) swap(arr[k][j], arr[max_r][j]); //交换矩阵右上角数据 if(arr[k][col]==0) //说明col列第k行以下全是0了,则处理当前行的下一列 { k--; continue; } for(i=k+1;i<equ;i++) //查找要删除的行 { if(arr[i][col]!=0) //左列不为0,进行消元运算 { lcm1=lcm(abs(arr[i][col]),abs(arr[k][col])); //求最小公倍数 ta=lcm1/abs(arr[i][col]); tb=lcm1/abs(arr[k][col]); if(arr[i][col]*arr[k][col]<0) //相乘为负,表示两数符号不同 tb=-tb; //异号的情况是两个数相加 for(j=col;j<var+1;j++) arr[i][j]=arr[i][j]*ta-arr[k][j]*tb; } } } for(i=k;i<equ;i++)//判断最后一行最后一列,若不为0,表示无解 if(arr[i][col]!=0) return -1; //返回无解 if(k<var)//自由变元有var-k个,即不确定的变元至少有var-k个. { for(i=k-1;i>=0;i--) { unuse_x_num=0; //判断该行中不确定变量数量,若超过1个,则无法求解 for(j=0;j<var;j++) { if(arr[i][j]!=0 && unuse_result[j]) { unuse_x_num++; unuse_index=j; } } if(unuse_x_num>1) continue; // 无法求解出确定的解 temp=arr[i][var]; for(j=0;j<var;j++) { if(arr[i][j]!=0 && j!=unuse_index) temp-=arr[i][j]*result[j]; } result[unuse_index]=temp/arr[i][unuse_index]; // 求出该变元. unuse_result[unuse_index]=0; //该变元是确定的 } return var-k; //自由变元有var-k个 } for(i=var-1;i>=0;i--) //回代求解 { temp=arr[i][var]; for(j=i+1;j<var;j++) { if(arr[i][j]!=0) temp-=arr[i][j]*result[j]; } if(temp % arr[i][i]!=0) //若不能整除 return -2; //返回有浮点数解,但无整数解 result[i]=temp/arr[i][i]; } return 0; }
相关文章推荐
- hdu 3976 高斯消元 模板
- 高斯消元的浮点数模板
- 高斯消元小结(贴一些模板)
- 高斯消元模板
- 高斯消元 浮点数模板
- sdut2878 环形依赖的DP(高斯消元,剪枝后的模板
- 高斯消元 【模板】
- 浮点数高斯消元的模板
- 高斯消元(模板(kuangbin版))
- 解方程组(高斯消元模板)
- 模板 poj2947 Widget Factory 高斯消元
- 高斯消元(模板)
- HDU3364(高斯消元开关问题)(模板)
- 高斯消元模板
- 高斯消元模板
- 【模板】高斯消元
- UVALive 6184 - One-Dimensional Cellular Automaton 高斯消元模板题 (2012 Tokyo)
- #1195 : 高斯消元·一(模板题)
- 高斯消元模板
- 高斯消元模板