百行以内实现复杂数学表达式计算

一改以前

本次先上代码

package good;
//Evaluate complex expressions
import java.io.IOException;
import java.util.Scanner;

public class Example {

public static void main(String[] arg) {

Scanner in = new Scanner(System.in);
String one = in.next();
try {
if (cont(one)==false){
throw new IOException();
}
System.out.println(one+"= " + RemoveBrackets(new StringBuffer(one)));
}
catch (Exception e){
System.out.println("Please check if the expression is valid if there is an error");
}
}

public static boolean cont(String a) {//Legality of judgment
boolean b = true;
char[] to = a.toCharArray();
int i, j;
for (i = 0; i < to.length - 1; i++) {
if (to[i] == '+' || to[i] == '-' || to[i] == '*' || to[i] == '/') {
if (to[i + 1] == '+' || to[i + 1] == '-' || to[i + 1] == '*' || to[i + 1] == '/') {
return false;
}
}
}
return b;
}


public static double RemoveBrackets(StringBuffer a) {//Bracket removal method

while (a.toString().indexOf('(') != -1) {
int i = a.toString().indexOf('(');
int j = GetBracketPosition(a.toString(), i + 1);
String to = a.toString().substring(i + 1, j);
a.replace(i, j + 1, String.valueOf(RemoveBrackets(new StringBuffer(to))));
}
return EliminatePlusSign(a.toString());//Calculate the formula other than parentheses
}


private static double EliminatePlusSign(String a) {//Eliminate the plus sign

char[] b = a.toCharArray();
for (int i = 0; i < a.length(); i++) {//Testing a plus sign
if (b[i] == '+') {
return EliminateMinusSign(a.substring(0, i)) + EliminatePlusSign(a.substring(i + 1));//Detection of minus
}
}

return EliminateMinusSign(a);//The minus sign is detected directly without the plus sign
}
private static double EliminateMinusSign(String a){//Check for subtractions and subdivisions
char[] b=a.toCharArray();
if (b[0]=='-'){
a="0"+a;
b=a.toCharArray();
}
for (int i = 0; i < a.length(); i++) {//Detection of minus
if (b[i] == '-' && (b[i-1]>='0') && b[i-1] return EliminatePlusSign(a.substring(0, i)) - EliminatePlusSign(a.substring(i + 1));
}
}

String[] sum1 = a.split("/");//Eliminate devide

double too = Double.valueOf(CalculateMultiplication(sum1[0]));/*A multiplication sign is detected for each division expression*/
for (int i = 1; i < sum1.length; i++) {
too = too * 1.0 /Double.valueOf(CalculateMultiplication(sum1[i]));
}
return too;

}

//So the only way to multiply is to multiply
private static double CalculateMultiplication(String aaa) {//Remove the multiplication sign
double to = 1.0;
if (aaa.indexOf('*') == -1) {//Without a multiplication sign
return Double.valueOf(aaa);
}
String[] too = aaa.split("\\*");

for (int i = 0; i < too.length; i++) {
to = to * Double.valueOf(too[i]);
}
return to;
}

private static int GetBracketPosition(String a, int b) {//Find the corresponding close parenthesis position
int count1 = 1;
int count2 = 0;
char[] aa = a.toCharArray();
for (int i = b; i < a.length(); i++) {
if (aa[i] == '(') {//Prevent double parenthesis
count1++;
}
if (aa[i] == ')') {
count2++;
if (count2 == count1) {
return i;
}
}
}
return 0;
}
}

下面是运行结果

百行以内实现复杂数学表达式计算

百行以内实现复杂数学表达式计算

OK 代码可以先看一下 相信肯定有人能够不靠解析 直接看懂

下面我来具体的一行一行的解释我的代码

先说一下具体思路

我们先考虑括号的问题 因为括号内容优先计算

当我们吧所有括号里面的内容处理好之后 我们用计算的结果替换掉括号以及里面的表达式

我们下面会将那种不带括号的表达式是怎样计算的

当然 必须要提示的一点 不排除会有双层括号情况的出现 所以我们要对拆分出来的括号里面分表达式在进行一次括号检测 当检测到没有括号的时候 我们才调用无括号表达式计算方法 计算表达式的最终结果

OK 下面我们进入无括号表达式计算方法的解释环节

现在强调一下 我们已经完成括号处理

我们的表达式里只有加减乘除的简单运算

我们先对其进行加号检测 拆成数个和运算 对前面的就不用再检测加号了 而对后面的则要再次检测加号

然后对每一个和运算表达式进行减号检测

然后把每一个减号表达式 检测除号 得到只可能有乘号的表达式

然后检测乘号

然后添加考虑 在检测加号时无加号 在检测减号时无减号 在检测乘号或除号是无乘号或除号时的操作

最后一一步一步将表达式转换成简单的字符串转换为数字的运算

并最终得到结果

哈哈哈哈 香不香

OK 我们的解析就到这

当然 方法肯定不止一种 比我这个方法好的方法也肯定多了去了

不喜勿喷

Original: https://www.cnblogs.com/cndccm/p/12864790.html
Author: Mr小明同学
Title: 百行以内实现复杂数学表达式计算

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/711526/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 跨域

    同源策略指三个相同:协议相同、域名相同、端口相同,有一个不同即非同源。 主域与子域、域名与域名对应的IP。都是非同源的 同源策略可以算是web安全的基石,没有同源策略就么有安全可言…

    技术杂谈 2023年5月31日
    081
  • Spring Boot 通用对象列表比较和去重

    1、前言 在Excel批量导入数据时,常常需要与数据库中已存在数据的比较,并且需要考虑导入数据重复的可能性。 导入的行数据,一般有一个实体类(对象)与之对应,往往这个实体类在数据库…

    技术杂谈 2023年6月21日
    084
  • NTT 快速数论变换

    NTT 先学习FFT由于FFT是使用复数运算,精度并不好,而且也无法取模,所以有了NTT(快速数论变换)。 建议先完全理解FFT后再学习NTT。 原根 NTT使用与单位根性质相似的…

    技术杂谈 2023年6月21日
    099
  • 学到了_SpringBoot项目整合ElasticSearch7.8.1(增删改查索引,增删改查文档)

    创建SpringBoot工程,更改pom文件 以下依赖全部使用到了,所以务必全部添加 <?xml version="1.0" encoding=&quot…

    技术杂谈 2023年7月25日
    099
  • Docker-dockerfile

    Docker-通过Dockerfile创建镜像 1.Dockerfile简介 简而言之,Dockerfile 是一个描述如何创建 Docker 镜像所需步骤的文本文件。 一个Doc…

    技术杂谈 2023年7月10日
    083
  • Spring中眼花缭乱的BeanDefinition

    本篇博客主要参考:Spring官网阅读(四)BeanDefinition(上) 引入主题 为什么要读Spring源码,有的人为了学习Spring中的先进思想,也有的人是为了更好的理…

    技术杂谈 2023年7月25日
    081
  • 辅导你的软件团队获得成功

    很少有人能靠自己的力量推进和发展自己的事业。一路上,他们有经验丰富的同事、导师和领导的帮助和指导。现在,你已经在职场上步步高升,你发现自己处于一个可以回报的位置。你有一个由软件工程…

    技术杂谈 2023年6月1日
    0100
  • 浅谈在线文档的那些事儿

    前言 对前端来说开发一个在线文档需要啥技术呢?想一下,开发一个在线文档我们可能要解决的问题: 最基础的文本编辑功能(哦?好像textarea就可以完成,那如果是富文本呢?)我们需要…

    技术杂谈 2023年5月31日
    074
  • docker安装es-header及相关问题解决

    docker pull mobz/elasticsearch-head:5 docker run –restart=always –name elasticsearch-hea…

    技术杂谈 2023年7月24日
    086
  • python 脚本或者flask 注册成为windows服务

    分享下脚本注册成为win服务 这个借鉴了其他大佬得 具体是谁忘记了有机会推荐 今天也是找了之前得改出来得 首先安装三个模块 最后一个是定时任务如果不需要可以不装 pip insta…

    技术杂谈 2023年7月11日
    089
  • Git常用命令

    克隆拉取远程代码 git clone https://xxxxxxxxx 本地添加远程仓库地址 git remote add origin(设定名字,随意。不过一般都叫这个名字) …

    技术杂谈 2023年6月21日
    072
  • Laravel使用Redis的哈希存储用户信息

    描述: 用户第一次登录,写入缓存的哈希数据,下次直接通过缓存的哈希数据读取。 介绍: Redis hash 是一个 string 类型的 field(字段) 和 value(值) …

    技术杂谈 2023年7月11日
    085
  • 59.你要的全拿走

    dsfsd posted @2022-09-28 08:33 随遇而安== 阅读(6 ) 评论() 编辑 Original: https://www.cnblogs.com/55z…

    技术杂谈 2023年6月21日
    098
  • js中创建正则对象时,变量中存在转义字符(’/’,’.’等)时,是否需要转义?

    使用直接量创建正则时,很方便,但是如果存在变量时,不适用。 使用正则对象(RegExp)创建时,对于变量中的转义字符不需要处理。 另外测试正则地址: https://develop…

    技术杂谈 2023年7月24日
    078
  • Playwright简单试用

    距上篇关于playwright文章过去有一年多了,主要是因为加上早期的playwright并不是很成熟,缺少我最常用到的直接通过CDP(chrome dev protocol)来连…

    技术杂谈 2023年5月31日
    098
  • 列表初始化

    C++11将列表初始化(大括号初始化)作为一种通用的初始化方式.可用于所有类型. 数组以前就可以用列表初始化,但 C++11 中的列表初始化新增了一些功能: 初始化数组时,可省略等…

    技术杂谈 2023年7月11日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球