HAO BAN ZI 包括求解,判断无解,求自由变元个数以及标记不确定的变元。来源:http://blog.csdn.net/keshuqi/article/details/51921615

  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<string.h>
  5. #include<math.h>
  6. using namespace std;
  7.  
  8. const int MAXN=;
  9.  
  10. int a[MAXN][MAXN];//增广矩阵
  11. int x[MAXN];//解集
  12. bool free_x[MAXN];//标记是否是不确定的变元,即自由元;
  13.  
  14. /*
  15. void Debug(void)
  16. {
  17. int i, j;
  18. for (i = 0; i < equ; i++)
  19. {
  20. for (j = 0; j < var + 1; j++)
  21. {
  22. cout << a[i][j] << " ";
  23. }
  24. cout << endl;
  25. }
  26. cout << endl;
  27. }
  28. */
  29.  
  30. inline int gcd(int a,int b)//非递归求最大公因数;
  31. {
  32. int t;
  33. while(b!=)
  34. {
  35. t=b;
  36. b=a%b;
  37. a=t;
  38. }
  39. return a;
  40. }
  41. inline int lcm(int a,int b)
  42. {
  43. return a/gcd(a,b)*b;//先除后乘防溢出,求最小公倍数;
  44. }
  45.  
  46. // 高斯消元法解方程组(Gauss-Jordan elimination).(-2表示有浮点数解,但无整数解,
  47. //-1表示无解,0表示唯一解,大于0表示无穷解,并返回自由变元的个数)
  48. //有equ个方程,var个变元。增广矩阵行数为equ,分别为0到equ-1,列数为var+1,分别为0到var,最后一列为等式右边数.
  49. int Gauss(int equ,int var)
  50. {
  51. int i,j,k;
  52. int max_r;// 当前这列绝对值最大的行.
  53. int col;//当前处理的列collum;
  54. int ta,tb;
  55. int LCM;
  56. int temp;
  57. int free_x_num;
  58. int free_index;
  59.  
  60. for(int i=;i<=var;i++)
  61. {
  62. x[i]=;
  63. free_x[i]=true;
  64. }
  65.  
  66. //转换为阶梯阵.
  67. col=; // 当前处理的列
  68. for(k = ;k < equ && col < var;k++,col++)
  69. {// 枚举当前处理的行.
  70. // 找到该col列元素绝对值最大的那行与第k行交换.(为了在除法时减小误差)
  71. max_r=k;
  72. for(i=k+;i<equ;i++)
  73. {
  74. if(abs(a[i][col])>abs(a[max_r][col])) max_r=i;
  75. }
  76. if(max_r!=k)
  77. {// 与第k行交换.
  78. for(j=k;j<var+;j++) swap(a[k][j],a[max_r][j]);
  79. }
  80. if(a[k][col]==)
  81. {// 说明该col列第k行以下全是0了,则处理当前行的下一列.
  82. k--;
  83. continue;
  84. }
  85. for(i=k+;i<equ;i++)
  86. {// 枚举要删去的行.
  87. if(a[i][col]!=)
  88. {
  89. LCM = lcm(abs(a[i][col]),abs(a[k][col]));
  90. ta = LCM/abs(a[i][col]);
  91. tb = LCM/abs(a[k][col]);
  92. if(a[i][col]*a[k][col]<)tb=-tb;//异号的情况是相加
  93. for(j=col;j<var+;j++)
  94. {
  95. a[i][j] = a[i][j]*ta-a[k][j]*tb;
  96. }
  97. }
  98. }
  99. }
  100.  
  101. // Debug();
  102.  
  103. // 1. 无解的情况: 化简的增广阵中存在(0, 0, ..., a)这样的行(a != 0).
  104. for (i = k; i < equ; i++)
  105. { // 对于无穷解来说,如果要判断哪些是自由变元,那么初等行变换中的交换就会影响,则要记录交换.
  106. if (a[i][col] != ) return -;
  107. }
  108. // 2. 无穷解的情况: 在var * (var + 1)的增广阵中出现(0, 0, ..., 0)这样的行,即说明没有形成严格的上三角阵.
  109. // 且出现的行数即为自由变元的个数.
  110. if (k < var)
  111. {
  112. // 首先,自由变元有var - k个,即不确定的变元至少有var - k个.
  113. for (i = k - ; i >= ; i--)
  114. {
  115. // 第i行一定不会是(0, 0, ..., 0)的情况,因为这样的行是在第k行到第equ行.
  116. // 同样,第i行一定不会是(0, 0, ..., a), a != 0的情况,这样的无解的.
  117. free_x_num = ; // 用于判断该行中的不确定的变元的个数,如果超过1个,则无法求解,它们仍然为不确定的变元.
  118. for (j = ; j < var; j++)
  119. {
  120. if (a[i][j] != && free_x[j]) free_x_num++, free_index = j;
  121. }
  122. if (free_x_num > ) continue; // 无法求解出确定的变元.
  123. // 说明就只有一个不确定的变元free_index,那么可以求解出该变元,且该变元是确定的.
  124. temp = a[i][var];
  125. for (j = ; j < var; j++)
  126. {
  127. if (a[i][j] != && j != free_index) temp -= a[i][j] * x[j];
  128. }
  129. x[free_index] = temp / a[i][free_index]; // 求出该变元.
  130. free_x[free_index] = ; // 该变元是确定的.
  131. }
  132. return var - k; // 自由变元有var - k个.
  133. }
  134. // 3. 唯一解的情况: 在var * (var + 1)的增广阵中形成严格的上三角阵.
  135. // 计算出Xn-1, Xn-2 ... X0.
  136. for (i = var - ; i >= ; i--)
  137. {
  138. temp = a[i][var];
  139. for (j = i + ; j < var; j++)
  140. {
  141. if (a[i][j] != ) temp -= a[i][j] * x[j];
  142. }
  143. if (temp % a[i][i] != ) return -; // 说明有浮点数解,但无整数解.
  144. x[i] = temp / a[i][i];
  145. }
  146. return ;
  147. }
  148. int main(void)
  149. {
  150. freopen("in.txt", "r", stdin);
  151. freopen("out.txt","w",stdout);
  152. int i, j;
  153. int equ,var;
  154. while (scanf("%d %d", &equ, &var) != EOF)
  155. {
  156. memset(a, , sizeof(a));
  157. for (i = ; i < equ; i++)
  158. {
  159. for (j = ; j < var + ; j++)
  160. {
  161. scanf("%d", &a[i][j]);
  162. }
  163. }
  164. // Debug();
  165. int free_num = Gauss(equ,var);
  166. if (free_num == -) printf("无解!\n");
  167. else if (free_num == -) printf("有浮点数解,无整数解!\n");
  168. else if (free_num > )
  169. {
  170. printf("无穷多解! 自由变元个数为%d\n", free_num);
  171. for (i = ; i < var; i++)
  172. {
  173. if (free_x[i]) printf("x%d 是不确定的\n", i + );
  174. else printf("x%d: %d\n", i + , x[i]);
  175. }
  176. }
  177. else
  178. {
  179. for (i = ; i < var; i++)
  180. {
  181. printf("x%d: %d\n", i + , x[i]);
  182. }
  183. }
  184. printf("\n");
  185. }
  186. return ;
  187. }

Super Moban的更多相关文章

  1. 子类继承父类时JVM报出Error:Implicit super constructor People() is undefined for default constructor. Must define an explicit constructor

    当子类继承父类的时候,若父类没有定义带参的构造方法,则子类可以继承父类的默认构造方法 当父类中定义了带参的构造方法,子类必须显式的调用父类的构造方法 若此时,子类还想调用父类的默认构造方法,必须在父类 ...

  2. [LeetCode] Super Ugly Number 超级丑陋数

    Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...

  3. Maven Super POM

    Maven super POM defines some properties. Three ways to find it ${M2_HOME}/lib/maven-model-builder-3. ...

  4. java基础 super 子类调用父类

    如果希望在子类中,去调用父类的构造方法,要求在子类的构造函数调用 example如下: package test; /* * 如果希望在子类中,去调用父类的构造方法,要求在子类的构造函数调用 * */ ...

  5. Python类中super()和__init__()的关系

    Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...

  6. java方法重载(overload)、重写(override);this、super关键简介

    一.方法重载: 条件:必须在一个类中,方法名称相同,参数列表不同(包括:数据类型.顺序.个数),典型案例构 造方重载.  注意:与返回值无关 二.方法重写: 条件: (1)继承某个类或实现某接口 (2 ...

  7. Java super关键字活用

    在实际开发中我们要自定义组件,就需要继承自某个组件类,如果我们自定义的这个组件类也需要像被继承的这个组件类一样,拥有丰富的构造方法. 关键字super的作用就更加显得尤为重要了,你可以在堆砌自己自定义 ...

  8. 深入super,看Python如何解决钻石继承难题 【转】

    原文地址 http://www.cnblogs.com/testview/p/4651198.html 1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通 ...

  9. 关于[super dealloc]

    销毁一个对象时,需要重写系统的dealloc方法来释放当前类所拥有的对象,在dealloc方法中需要先释放当前类中所有的对象,然后再调用[super dealloc]释放父类中所拥有的对象.如先调用[ ...

随机推荐

  1. php将html页面截图并保存成图片

    采用html5的canvas,将图片绘制到画布上,然后用canvas的 toDataURL 方法. 但是在图片转base64的过程中遇到了两个问题, 1:图片无法绘制,转成的base64 用浏览器打开 ...

  2. Laravel -- 模型

    模型文件 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Student extends Model { / ...

  3. 阻塞队列之LinkedBlockingQueue

    概述 LinkedBlockingQueue内部由单链表实现,只能从head取元素,从tail添加元素.添加元素和获取元素都有独立的锁,也就是说LinkedBlockingQueue是读写分离的,读写 ...

  4. 网站mysql防止sql注入攻击 3种方法总结

    mysql数据库一直以来都遭受到sql注入攻击的影响,很多网站,包括目前的PC端以及手机端都在使用php+mysql数据库这种架构,大多数网站受到的攻击都是与sql注入攻击有关,那么mysql数据库如 ...

  5. class实现Stack

    基于class实现一个存储string类型的Stack 头文件: //stack.h #include<vector> #include<string> class Stack ...

  6. [ACM] POJ 2409 Let it Bead (Polya计数)

    参考:https://blog.csdn.net/sr_19930829/article/details/38108871 #include <iostream> #include < ...

  7. 最新cloudera大数据培训班 ccah ccdh 数据分析师 数据科学家

      上海2月21-24日Cloudera Developer training for Spark and Hadoop(CCA-175)北京2月23-26日Cloudera Developer tr ...

  8. echarts的pie图中,各区块颜色的调整

    今天在学习使用echarts生成各种图表. 然后在使用pie图时出现我无论怎么更改代码中的颜色,pie图中各块的颜色都十分相近,几乎没法区别块与块之间的区别,如下图: 在下图中,除了其中一块的是红色的 ...

  9. 洛谷P1364 医院设置

    LITTLESUN的第一道图论,撒花~~ 题目链接 这道题是Floyd的板子题 注意对于矩阵图的初始值赋值要全部赋值成最大值 十六进制的最大值表示方式是0x3f3f3f3f memset(G,0x3f ...

  10. Hibernate-ORM:16.Hibernate中的二级缓存Ehcache的配置

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述Hibernate中的二级缓存的配置,作者将使用的是ehcache缓存 一,目录 1.二级缓存的具 ...