通过C/C++,实现一元一次方程求解:

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. string str, str_l, str_r;
  5.  
  6. struct node
  7. {
  8. // a表示x前面的系数,b表示常数系数
  9. double a, b;
  10. };
  11.  
  12. // 判断优先级的大小
  13. int priority(char c)
  14. {
  15. if (c == '*' || c == '/')
  16. return ;
  17. if (c == '+' || c == '-')
  18. return ;
  19. return ;
  20. }
  21.  
  22. void calc(stack <char> &op, stack <node> &num)
  23. {
  24. node bb = num.top();
  25. num.pop();
  26. node aa = num.top();
  27. num.pop();
  28. node temp_node;
  29.  
  30. switch (op.top())
  31. {
  32. case '+':
  33. temp_node.a = aa.a + bb.a;
  34. temp_node.b = aa.b + bb.b;
  35. num.push(temp_node);
  36. break;
  37. case '-':
  38. temp_node.a = aa.a - bb.a;
  39. temp_node.b = aa.b - bb.b;
  40. num.push(temp_node);
  41. break;
  42. case '*':
  43. // 处理一元一次方程,不考虑二次项
  44. temp_node.a = aa.a * bb.b + aa.b * bb.a;
  45. temp_node.b = aa.b * bb.b;
  46. num.push(temp_node);
  47. break;
  48. case '/':
  49. temp_node.a = aa.a / bb.b;
  50. temp_node.b = aa.b / bb.b;
  51. num.push(temp_node);
  52. break;
  53. }
  54. op.pop();
  55. }
  56.  
  57. int main()
  58. {
  59. while ()
  60. {
  61. cin >>str;
  62.  
  63. // 得到str_l, str_r
  64. for (int i = ; i < str.size(); ++ i)
  65. {
  66. if (str[i] == '=')
  67. {
  68. str_l = str.substr(, i);
  69. str_r = str.substr(i + , str.size());
  70. }
  71. }
  72.  
  73. // 定义符号栈、数字栈
  74. stack <node> num_l;
  75. stack <node> num_r;
  76. stack <char> op_l;
  77. stack <char> op_r;
  78. // 定义左右两边串的长度
  79. int len_l = str_l.size();
  80. int len_r = str_r.size();
  81.  
  82. // 遍历左边的字符串
  83. for (int i = ; i < len_l; ++ i)
  84. {
  85. if (isdigit(str_l[i]))
  86. {
  87. node temp_node;
  88. double temp = atof(&str_l[i]);
  89. while (isdigit(str_l[i]) || str_l[i] == '.')
  90. ++ i;
  91. if (str_l[i] == 'x')
  92. {
  93. temp_node.a = temp;
  94. temp_node.b = ;
  95. num_l.push(temp_node);
  96. }
  97. else
  98. {
  99. temp_node.a = ;
  100. temp_node.b = temp;
  101. num_l.push(temp_node);
  102. -- i;
  103. }
  104. }
  105. else if (str_l[i] == 'x')
  106. {
  107. node temp_node;
  108. temp_node.a = ;
  109. temp_node.b = ;
  110. num_l.push(temp_node);
  111. }
  112. else if (str_l[i] == '(')
  113. {
  114. op_l.push(str_l[i]);
  115. }
  116. else if (str_l[i] == ')')
  117. {
  118. while (op_l.top() != '(')
  119. calc(op_l, num_l);
  120. op_l.pop();
  121. }
  122. else if (op_l.empty())
  123. {
  124. op_l.push(str_l[i]);
  125. }
  126. else if (priority(op_l.top()) < priority(str_l[i]))
  127. {
  128. op_l.push(str_l[i]);
  129. }
  130. else if (priority(op_l.top()) >= priority(str_l[i]))
  131. {
  132. while (!op_l.empty() && priority(op_l.top()) >= priority(str_l[i]))
  133. calc(op_l, num_l);
  134. op_l.push(str_l[i]);
  135. }
  136. }
  137.  
  138. // 遍历右边的字符串
  139. for (int i = ; i < len_r; ++ i)
  140. {
  141. if (isdigit(str_r[i]))
  142. {
  143. node temp_node;
  144. double temp = atof(&str_r[i]);
  145. while (isdigit(str_r[i]) || str_r[i] == '.')
  146. ++ i;
  147. if (str_r[i] == 'x')
  148. {
  149. temp_node.a = temp;
  150. temp_node.b = ;
  151. num_r.push(temp_node);
  152. }
  153. else
  154. {
  155. temp_node.a = ;
  156. temp_node.b = temp;
  157. num_r.push(temp_node);
  158. -- i;
  159. }
  160. }
  161. else if (str_r[i] == 'x')
  162. {
  163. node temp_node;
  164. temp_node.a = ;
  165. temp_node.b = ;
  166. num_r.push(temp_node);
  167. }
  168. else if (str_r[i] == '(')
  169. {
  170. op_r.push(str_r[i]);
  171. }
  172. else if (str_r[i] == ')')
  173. {
  174. while (op_r.top() != '(')
  175. calc(op_r, num_r);
  176. op_r.pop();
  177. }
  178. else if (op_r.empty())
  179. {
  180. op_r.push(str_r[i]);
  181. }
  182. else if (priority(op_r.top()) < priority(str_r[i]))
  183. {
  184. op_r.push(str_r[i]);
  185. }
  186. else if (priority(op_r.top()) >= priority(str_r[i]))
  187. {
  188. while (!op_r.empty() && priority(op_r.top()) >= priority(str_r[i]))
  189. calc(op_r, num_r);
  190. op_r.push(str_r[i]);
  191. }
  192. }
  193.  
  194. while (!op_l.empty())
  195. calc(op_l, num_l);
  196. while (!op_r.empty())
  197. calc(op_r, num_r);
  198.  
  199. double x1 = num_l.top().a, y1 = num_l.top().b;
  200. double x2 = num_r.top().a, y2 = num_r.top().b;
  201.  
  202. // cout <<x1 <<" " <<y1 <<" " <<x2 <<" " <<y2 <<endl;
  203. printf("%.2lf\n", (y2 - y1) / (x1 - x2));
  204. }
  205.  
  206. return ;
  207. }

通过C/C++,实现一元一次方程求解的更多相关文章

  1. C++第9周(春)项目5 - 一元一次方程类

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目5]设计一元一次方程类.求形如ax+b= ...

  2. NOIP2001 一元三次方程求解

    题一  一元三次方程求解(20分) 问题描述 有形如:ax3+bx2+cx+d=0  这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d  均为实数),并约定该方程存在三个不同实根(根的范 ...

  3. Vijos P1116 一元三次方程求解【多解,暴力,二分】

    一元三次方程求解 描述 有形如:ax^3+bx^2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之 ...

  4. [NOIP提高&洛谷P1024]一元三次方程求解 题解(二分答案)

    [NOIP提高&洛谷P1024]一元三次方程求解 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约 ...

  5. 计算一元一次方程Y=kX+b

    开发过程中用不到一元一次方程吗?非也,iOS开发中经常会遇到根据某个ScrollView动态偏移量的值来实时设置一个View的透明度,你敢说你不用一元一次方程你能搞定? 想把一个动画效果做好,经常会遇 ...

  6. 洛谷——P1024 一元三次方程求解

    P1024 一元三次方程求解 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-10 ...

  7. P1024 一元三次方程求解

    P1024 一元三次方程求解 #include<cstdio> #include<iostream> #include<algorithm> using names ...

  8. 洛谷P1024 一元三次方程求解

    P1024 一元三次方程求解 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-10 ...

  9. Codevs 1038 一元三次方程求解 NOIP 2001(导数 牛顿迭代)

    1038 一元三次方程求解 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 有形如:ax3+b ...

随机推荐

  1. Springboot读取Request参数的坑

    [后端拿参数相关] 默认配置时, getInputStream()和getReader()一起使用会报错 使用两遍getInputStream(),第二遍会为空   当存在@RequestBody等注 ...

  2. Hello World ! 节日快乐!

    节日快乐! 世界你好,Hello World Java public class HelloWorld{ public static void main(String[] args) { System ...

  3. 前端深入之css篇丨初探【transform】,手把手带你实现1024程序员节动画

    写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...

  4. 概念理解:boost::asio::定时器2

    多线程同步回调#include <cstdio> #include <iostream> #include <boost/asio.hpp> #include &l ...

  5. insert into select 引起的 "子查询返回的值不止一个。当子查询跟随在**之后,或子查询用作表达式时,这种情况是不允许的"

    目录 1.事故现场 1.1 在使用 Insert into Table2 select * from Table1 将表1的数据插入到表2时,报错如下: 1.2 sql 语句 2.推测 3.解决方案 ...

  6. 【Autofac打标签模式】Aspect拦截器

    [ Autofac打标签模式]开源DI框架扩展地址: https://github.com/yuzd/Autofac.Annotation/wiki 前提条件 自己new一个对象不能实现拦截器功能,必 ...

  7. 富文本编辑器(wangEditor)

    近期在产品的开发工作中遇到要使用富文本编辑器的地方.于是对比了几款编辑器, 最后选择了wangEditor. 优点:轻量.简洁.界面美观.文档齐全.   缺点: 相较于百度ueditor等编辑器功能较 ...

  8. c语言-----劫持原理

    1. 劫持原理介绍 (1) 通过劫持技术我们可以实现某些进程的拦截,比如禁止创建文件,禁止打开qq,禁止关机等等一系列的操作 (2) 弹窗拦截就是最常见的一种劫持技术的实现. 2. 使用的工具 (1) ...

  9. Qt 表格的使用

    参考 http://doc.qt.io/qt-5/qtablewidget.html http://doc.qt.io/qt-5/qtablewidgetitem.html https://blog. ...

  10. dubbo初学采坑记

    写在前面的话 dubbo 现在是apache组织旗下的项目,相信国内也有很多人使用.最近一个同事离职,我就接手了他的项目.远程通讯就是用的dubbo框架来实现的.使用Intelij idea 写了一个 ...