通过C/C++,实现一元一次方程求解
通过C/C++,实现一元一次方程求解:
- #include <bits/stdc++.h>
- using namespace std;
- string str, str_l, str_r;
- struct node
- {
- // a表示x前面的系数,b表示常数系数
- double a, b;
- };
- // 判断优先级的大小
- int priority(char c)
- {
- if (c == '*' || c == '/')
- return ;
- if (c == '+' || c == '-')
- return ;
- return ;
- }
- void calc(stack <char> &op, stack <node> &num)
- {
- node bb = num.top();
- num.pop();
- node aa = num.top();
- num.pop();
- node temp_node;
- switch (op.top())
- {
- case '+':
- temp_node.a = aa.a + bb.a;
- temp_node.b = aa.b + bb.b;
- num.push(temp_node);
- break;
- case '-':
- temp_node.a = aa.a - bb.a;
- temp_node.b = aa.b - bb.b;
- num.push(temp_node);
- break;
- case '*':
- // 处理一元一次方程,不考虑二次项
- temp_node.a = aa.a * bb.b + aa.b * bb.a;
- temp_node.b = aa.b * bb.b;
- num.push(temp_node);
- break;
- case '/':
- temp_node.a = aa.a / bb.b;
- temp_node.b = aa.b / bb.b;
- num.push(temp_node);
- break;
- }
- op.pop();
- }
- int main()
- {
- while ()
- {
- cin >>str;
- // 得到str_l, str_r
- for (int i = ; i < str.size(); ++ i)
- {
- if (str[i] == '=')
- {
- str_l = str.substr(, i);
- str_r = str.substr(i + , str.size());
- }
- }
- // 定义符号栈、数字栈
- stack <node> num_l;
- stack <node> num_r;
- stack <char> op_l;
- stack <char> op_r;
- // 定义左右两边串的长度
- int len_l = str_l.size();
- int len_r = str_r.size();
- // 遍历左边的字符串
- for (int i = ; i < len_l; ++ i)
- {
- if (isdigit(str_l[i]))
- {
- node temp_node;
- double temp = atof(&str_l[i]);
- while (isdigit(str_l[i]) || str_l[i] == '.')
- ++ i;
- if (str_l[i] == 'x')
- {
- temp_node.a = temp;
- temp_node.b = ;
- num_l.push(temp_node);
- }
- else
- {
- temp_node.a = ;
- temp_node.b = temp;
- num_l.push(temp_node);
- -- i;
- }
- }
- else if (str_l[i] == 'x')
- {
- node temp_node;
- temp_node.a = ;
- temp_node.b = ;
- num_l.push(temp_node);
- }
- else if (str_l[i] == '(')
- {
- op_l.push(str_l[i]);
- }
- else if (str_l[i] == ')')
- {
- while (op_l.top() != '(')
- calc(op_l, num_l);
- op_l.pop();
- }
- else if (op_l.empty())
- {
- op_l.push(str_l[i]);
- }
- else if (priority(op_l.top()) < priority(str_l[i]))
- {
- op_l.push(str_l[i]);
- }
- else if (priority(op_l.top()) >= priority(str_l[i]))
- {
- while (!op_l.empty() && priority(op_l.top()) >= priority(str_l[i]))
- calc(op_l, num_l);
- op_l.push(str_l[i]);
- }
- }
- // 遍历右边的字符串
- for (int i = ; i < len_r; ++ i)
- {
- if (isdigit(str_r[i]))
- {
- node temp_node;
- double temp = atof(&str_r[i]);
- while (isdigit(str_r[i]) || str_r[i] == '.')
- ++ i;
- if (str_r[i] == 'x')
- {
- temp_node.a = temp;
- temp_node.b = ;
- num_r.push(temp_node);
- }
- else
- {
- temp_node.a = ;
- temp_node.b = temp;
- num_r.push(temp_node);
- -- i;
- }
- }
- else if (str_r[i] == 'x')
- {
- node temp_node;
- temp_node.a = ;
- temp_node.b = ;
- num_r.push(temp_node);
- }
- else if (str_r[i] == '(')
- {
- op_r.push(str_r[i]);
- }
- else if (str_r[i] == ')')
- {
- while (op_r.top() != '(')
- calc(op_r, num_r);
- op_r.pop();
- }
- else if (op_r.empty())
- {
- op_r.push(str_r[i]);
- }
- else if (priority(op_r.top()) < priority(str_r[i]))
- {
- op_r.push(str_r[i]);
- }
- else if (priority(op_r.top()) >= priority(str_r[i]))
- {
- while (!op_r.empty() && priority(op_r.top()) >= priority(str_r[i]))
- calc(op_r, num_r);
- op_r.push(str_r[i]);
- }
- }
- while (!op_l.empty())
- calc(op_l, num_l);
- while (!op_r.empty())
- calc(op_r, num_r);
- double x1 = num_l.top().a, y1 = num_l.top().b;
- double x2 = num_r.top().a, y2 = num_r.top().b;
- // cout <<x1 <<" " <<y1 <<" " <<x2 <<" " <<y2 <<endl;
- printf("%.2lf\n", (y2 - y1) / (x1 - x2));
- }
- return ;
- }
通过C/C++,实现一元一次方程求解的更多相关文章
- C++第9周(春)项目5 - 一元一次方程类
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目5]设计一元一次方程类.求形如ax+b= ...
- NOIP2001 一元三次方程求解
题一 一元三次方程求解(20分) 问题描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范 ...
- Vijos P1116 一元三次方程求解【多解,暴力,二分】
一元三次方程求解 描述 有形如:ax^3+bx^2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之 ...
- [NOIP提高&洛谷P1024]一元三次方程求解 题解(二分答案)
[NOIP提高&洛谷P1024]一元三次方程求解 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约 ...
- 计算一元一次方程Y=kX+b
开发过程中用不到一元一次方程吗?非也,iOS开发中经常会遇到根据某个ScrollView动态偏移量的值来实时设置一个View的透明度,你敢说你不用一元一次方程你能搞定? 想把一个动画效果做好,经常会遇 ...
- 洛谷——P1024 一元三次方程求解
P1024 一元三次方程求解 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-10 ...
- P1024 一元三次方程求解
P1024 一元三次方程求解 #include<cstdio> #include<iostream> #include<algorithm> using names ...
- 洛谷P1024 一元三次方程求解
P1024 一元三次方程求解 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-10 ...
- Codevs 1038 一元三次方程求解 NOIP 2001(导数 牛顿迭代)
1038 一元三次方程求解 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 有形如:ax3+b ...
随机推荐
- Springboot读取Request参数的坑
[后端拿参数相关] 默认配置时, getInputStream()和getReader()一起使用会报错 使用两遍getInputStream(),第二遍会为空 当存在@RequestBody等注 ...
- Hello World ! 节日快乐!
节日快乐! 世界你好,Hello World Java public class HelloWorld{ public static void main(String[] args) { System ...
- 前端深入之css篇丨初探【transform】,手把手带你实现1024程序员节动画
写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...
- 概念理解:boost::asio::定时器2
多线程同步回调#include <cstdio> #include <iostream> #include <boost/asio.hpp> #include &l ...
- insert into select 引起的 "子查询返回的值不止一个。当子查询跟随在**之后,或子查询用作表达式时,这种情况是不允许的"
目录 1.事故现场 1.1 在使用 Insert into Table2 select * from Table1 将表1的数据插入到表2时,报错如下: 1.2 sql 语句 2.推测 3.解决方案 ...
- 【Autofac打标签模式】Aspect拦截器
[ Autofac打标签模式]开源DI框架扩展地址: https://github.com/yuzd/Autofac.Annotation/wiki 前提条件 自己new一个对象不能实现拦截器功能,必 ...
- 富文本编辑器(wangEditor)
近期在产品的开发工作中遇到要使用富文本编辑器的地方.于是对比了几款编辑器, 最后选择了wangEditor. 优点:轻量.简洁.界面美观.文档齐全. 缺点: 相较于百度ueditor等编辑器功能较 ...
- c语言-----劫持原理
1. 劫持原理介绍 (1) 通过劫持技术我们可以实现某些进程的拦截,比如禁止创建文件,禁止打开qq,禁止关机等等一系列的操作 (2) 弹窗拦截就是最常见的一种劫持技术的实现. 2. 使用的工具 (1) ...
- Qt 表格的使用
参考 http://doc.qt.io/qt-5/qtablewidget.html http://doc.qt.io/qt-5/qtablewidgetitem.html https://blog. ...
- dubbo初学采坑记
写在前面的话 dubbo 现在是apache组织旗下的项目,相信国内也有很多人使用.最近一个同事离职,我就接手了他的项目.远程通讯就是用的dubbo框架来实现的.使用Intelij idea 写了一个 ...