- 浏览: 216802 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (121)
- 投资杂记 (6)
- Java技术 (46)
- 记忆 (7)
- 科技随笔 (6)
- 随感 (8)
- 漫谈云计算 (4)
- 生活点滴 (1)
- andriod笔记 (13)
- mysql-数据库 (2)
- OSGI (1)
- Spring Data JPA (1)
- gradle maven nexus (1)
- Java性能优化 多核线程 优化 (2)
- Open-Erp (oe) (8)
- Java技术 camel (1)
- jetty camel dynamicRouter (1)
- karaf (1)
- amqp apollo camel karaf (1)
- Java技术 MyCat (1)
- Java技术 并行调用 线程池 (1)
最新评论
-
白云天:
主机网络端口使用命令: netstat -nplt
centos7.4上安装mysql5.7记录 -
白云天:
登录到 容器内部 docker ps -a查询容器IDsudo ...
docker初探 -
白云天:
export jars to local directory ...
Camel的direct,Bean测试 -
白云天:
location /esb/ { proxy_ ...
Camel的direct,Bean测试 -
白云天:
centos 中添加 shell_script.sh 为开机启 ...
Camel的direct,Bean测试
可以计算: 加减乘除,余数,括号 , 结果为整数,操作数全部为整数。
中间应该有考虑不周的地方,请给我留言。附上计算表达式。
转载,请注明本地址
测试:
public static void main(String[] args) throws Exception {
String exp = "-1*((24+8)/(6+2)*5-10)/2*2+10/2+200";
// exp = "(9/2-1)/2*2-1+9-8%2";
// exp = "(120-4/2/1*20)/8-1";
// exp="100-(1+100)";
// exp="-20-20*4/(2+2)*1+100/4";
// exp="-100/2*100";
// exp="-10+100/2";
exp="-2*(3-4)";
int v = Jisuanqi.cal(exp);
System.out.println(exp + "=" + v);
}
/**
*
* @author jeffay.jiang
*/
public class Jisuanqi {
public static String getFirstNumber(String exp, int pos,boolean bSub) {
String v = "";
if(bSub && exp.charAt(pos)=='-'){
pos++;
v="-";
}
char c = exp.charAt(pos);
while (c >= '0' && c <= '9' || c == '.') {
v = v + c;
pos++;
if (pos >= exp.length()) {
break;
}
c = exp.charAt(pos);
}
return v;
}
public static String getKuhaoExp(String exp, int pos) {
String v = "";
char c;
int k = 1;
int to = pos;
for (int i = pos; i < exp.length(); i++) {
if (exp.charAt(i) == '(') {
k++;
}
if (exp.charAt(i) == ')') {
k--;
}
if (k == 0) {
to = i;
break;
}
}
v = exp.substring(pos, to);
//System.out.println("---exp=" + exp + ",Pos=" + pos + ",One=" + v);
return v;
}
public static int cal(String exp) throws Exception {
// System.out.println("=================" + exp);
if (exp == null || exp.length() == 0) {
return 0;
}
boolean bSub = false;
String ops = "+-"; //计算加号
int index = 0;
while (index < exp.length()) {
if (exp.charAt(index) == '-') {
if (bSub) {
bSub = false;
} else {
bSub = true;
}
}
if (ops.indexOf(exp.charAt(index)) >= 0) {
exp = exp.substring(1); //去掉前面的 +- 符号
} else {
break;
}
}
int v = 0;
String kha = "(";
int k = exp.indexOf(kha);
if (k >= 0) { //先处理括号
String exp1 = exp.substring(0, k);
String exp2 = getKuhaoExp(exp, k + 1);//从k+1起,到匹配的 )
String exp3 = exp.substring(k + exp2.length() + 2);
int vp = cal(exp2);
if (bSub) {
if(exp1.length()==0){
vp=(-1)*vp;
}else{
exp1 = "-" + exp1;
}
}
// System.out.println("&&&&&&&&&&&&&&&&&& exp1="+exp1 +",vp="+vp+", exp2="+exp2+",v="+vp+", sub="+bSub);
String expn=exp1 + String.valueOf(vp) + exp3;
// System.out.println("::::::::::::::::::::::::::new exp="+expn +", have-sub="+bSub);
v = cal(expn);
return v;
}
ops = "*/%"; //先算乘除
index = 0;
while (index < exp.length()) {
if (ops.indexOf(exp.charAt(index)) >= 0) {
exp = exp.substring(1); //去掉前面的 */% 符号
} else {
break;
}
}
for (int i = 0; i < exp.length(); i++) {
if (ops.indexOf(exp.charAt(i)) >= 0) { //有 乘除符号
String exp1 = exp.substring(0, i);
char op = exp.charAt(i);
String exp2 = exp.substring(i + 1);
if (bSub) {
exp1 = "-" + exp1;
}
return chengchu(exp1, op, exp2);
}
}
ops = "+-"; //计算加号 , 在算加减
for (int i = 0; i < exp.length(); i++) {
if (ops.indexOf(exp.charAt(i)) >= 0) { //有 乘除符号
String exp1 = exp.substring(0, i);
char op = exp.charAt(i);
String exp2 = exp.substring(i + 1);
if (bSub) {
exp1 = "-" + exp1;
}
return jiajian(exp1, op, exp2);
}
}
v = Integer.parseInt(exp);
if(bSub){
v=(-1)*v;
}
return v;
}
private static int chengchu(String exp1, char op, String exp2) throws Exception {
// System.out.println("**********chengchu*******" + exp1 + "," + op + "," + exp2+"]");
if (exp2.length() == 0) {
return Integer.parseInt(exp1);
}
String last = getLastNumber(exp1);
String next = getFirstNumber(exp2, 0,true);
String left = exp2.substring(next.length());
exp1 = exp1.substring(0, exp1.length() - last.length());
// System.out.println(" ******pre=" + exp1 + ", last=" + last + ", next=" + next + ", left=" + left);
int v = 0;
if (op == '*') {
v = Integer.parseInt(last) * Integer.parseInt(next);
}
if (op == '/') {
v = Integer.parseInt(last) / Integer.parseInt(next);
}
if (op == '%') {
v = Integer.parseInt(last) % Integer.parseInt(next);
}
if (left.length() > 0 || exp1.length() > 0) {
// System.out.println(" ******pre=" + exp1 + ", v=" + v + ", left=" + left);
v = cal(exp1 + String.valueOf(v) + left);
}
return v;
}
public static String getLastNumber(String exp) {
String s = "";
int i = exp.length();
char c;
while (i > 0) {
c = exp.charAt(i - 1);
i--;
if (c >= '0' && c <= '9') {
s = c + s;
} else {
break;
}
}
return s;
}
private static int jiajian(String exp1, char op, String exp2) throws Exception {
// System.out.println("+++++++++++++++++" + exp1 + "," + op + "," + exp2);
if (exp2.length() == 0) {
return Integer.parseInt(exp1);
}
String next = getFirstNumber(exp2, 0,false);
String left = exp2.substring(next.length());
int v = 0;
if (op == '+') {
v = Integer.parseInt(exp1) + Integer.parseInt(next);
}
if (op == '-') {
v = Integer.parseInt(exp1) - Integer.parseInt(next);
}
if (left.length() > 0) {
v = cal(String.valueOf(v) + left);
}
return v;
}
}
中间应该有考虑不周的地方,请给我留言。附上计算表达式。
转载,请注明本地址
测试:
public static void main(String[] args) throws Exception {
String exp = "-1*((24+8)/(6+2)*5-10)/2*2+10/2+200";
// exp = "(9/2-1)/2*2-1+9-8%2";
// exp = "(120-4/2/1*20)/8-1";
// exp="100-(1+100)";
// exp="-20-20*4/(2+2)*1+100/4";
// exp="-100/2*100";
// exp="-10+100/2";
exp="-2*(3-4)";
int v = Jisuanqi.cal(exp);
System.out.println(exp + "=" + v);
}
/**
*
* @author jeffay.jiang
*/
public class Jisuanqi {
public static String getFirstNumber(String exp, int pos,boolean bSub) {
String v = "";
if(bSub && exp.charAt(pos)=='-'){
pos++;
v="-";
}
char c = exp.charAt(pos);
while (c >= '0' && c <= '9' || c == '.') {
v = v + c;
pos++;
if (pos >= exp.length()) {
break;
}
c = exp.charAt(pos);
}
return v;
}
public static String getKuhaoExp(String exp, int pos) {
String v = "";
char c;
int k = 1;
int to = pos;
for (int i = pos; i < exp.length(); i++) {
if (exp.charAt(i) == '(') {
k++;
}
if (exp.charAt(i) == ')') {
k--;
}
if (k == 0) {
to = i;
break;
}
}
v = exp.substring(pos, to);
//System.out.println("---exp=" + exp + ",Pos=" + pos + ",One=" + v);
return v;
}
public static int cal(String exp) throws Exception {
// System.out.println("=================" + exp);
if (exp == null || exp.length() == 0) {
return 0;
}
boolean bSub = false;
String ops = "+-"; //计算加号
int index = 0;
while (index < exp.length()) {
if (exp.charAt(index) == '-') {
if (bSub) {
bSub = false;
} else {
bSub = true;
}
}
if (ops.indexOf(exp.charAt(index)) >= 0) {
exp = exp.substring(1); //去掉前面的 +- 符号
} else {
break;
}
}
int v = 0;
String kha = "(";
int k = exp.indexOf(kha);
if (k >= 0) { //先处理括号
String exp1 = exp.substring(0, k);
String exp2 = getKuhaoExp(exp, k + 1);//从k+1起,到匹配的 )
String exp3 = exp.substring(k + exp2.length() + 2);
int vp = cal(exp2);
if (bSub) {
if(exp1.length()==0){
vp=(-1)*vp;
}else{
exp1 = "-" + exp1;
}
}
// System.out.println("&&&&&&&&&&&&&&&&&& exp1="+exp1 +",vp="+vp+", exp2="+exp2+",v="+vp+", sub="+bSub);
String expn=exp1 + String.valueOf(vp) + exp3;
// System.out.println("::::::::::::::::::::::::::new exp="+expn +", have-sub="+bSub);
v = cal(expn);
return v;
}
ops = "*/%"; //先算乘除
index = 0;
while (index < exp.length()) {
if (ops.indexOf(exp.charAt(index)) >= 0) {
exp = exp.substring(1); //去掉前面的 */% 符号
} else {
break;
}
}
for (int i = 0; i < exp.length(); i++) {
if (ops.indexOf(exp.charAt(i)) >= 0) { //有 乘除符号
String exp1 = exp.substring(0, i);
char op = exp.charAt(i);
String exp2 = exp.substring(i + 1);
if (bSub) {
exp1 = "-" + exp1;
}
return chengchu(exp1, op, exp2);
}
}
ops = "+-"; //计算加号 , 在算加减
for (int i = 0; i < exp.length(); i++) {
if (ops.indexOf(exp.charAt(i)) >= 0) { //有 乘除符号
String exp1 = exp.substring(0, i);
char op = exp.charAt(i);
String exp2 = exp.substring(i + 1);
if (bSub) {
exp1 = "-" + exp1;
}
return jiajian(exp1, op, exp2);
}
}
v = Integer.parseInt(exp);
if(bSub){
v=(-1)*v;
}
return v;
}
private static int chengchu(String exp1, char op, String exp2) throws Exception {
// System.out.println("**********chengchu*******" + exp1 + "," + op + "," + exp2+"]");
if (exp2.length() == 0) {
return Integer.parseInt(exp1);
}
String last = getLastNumber(exp1);
String next = getFirstNumber(exp2, 0,true);
String left = exp2.substring(next.length());
exp1 = exp1.substring(0, exp1.length() - last.length());
// System.out.println(" ******pre=" + exp1 + ", last=" + last + ", next=" + next + ", left=" + left);
int v = 0;
if (op == '*') {
v = Integer.parseInt(last) * Integer.parseInt(next);
}
if (op == '/') {
v = Integer.parseInt(last) / Integer.parseInt(next);
}
if (op == '%') {
v = Integer.parseInt(last) % Integer.parseInt(next);
}
if (left.length() > 0 || exp1.length() > 0) {
// System.out.println(" ******pre=" + exp1 + ", v=" + v + ", left=" + left);
v = cal(exp1 + String.valueOf(v) + left);
}
return v;
}
public static String getLastNumber(String exp) {
String s = "";
int i = exp.length();
char c;
while (i > 0) {
c = exp.charAt(i - 1);
i--;
if (c >= '0' && c <= '9') {
s = c + s;
} else {
break;
}
}
return s;
}
private static int jiajian(String exp1, char op, String exp2) throws Exception {
// System.out.println("+++++++++++++++++" + exp1 + "," + op + "," + exp2);
if (exp2.length() == 0) {
return Integer.parseInt(exp1);
}
String next = getFirstNumber(exp2, 0,false);
String left = exp2.substring(next.length());
int v = 0;
if (op == '+') {
v = Integer.parseInt(exp1) + Integer.parseInt(next);
}
if (op == '-') {
v = Integer.parseInt(exp1) - Integer.parseInt(next);
}
if (left.length() > 0) {
v = cal(String.valueOf(v) + left);
}
return v;
}
}
发表评论
-
docker初探
2017-08-17 16:49 6231、docker , 先从仓库中下载一个和自己的 ... -
java-nio的hello-word
2017-04-27 17:55 504重点注意:有说明的地 ... -
Java NIO 系列教程
2015-07-02 14:28 884Java NIO提供了与标准IO不同的IO工作方式: ... -
随手记录-设计目录中的jar到类路径
2015-05-07 18:01 791@echo off color 7 SetLocal Enab ... -
gradle和maven结合nexus服务解决jar包依赖
2014-07-17 11:00 16361、架设 nexus nexus 的基础不多讲了,去官网下载 ... -
利用注解定义SQL语句,实现类是iBatis的数据库访问
2014-06-25 18:04 3541import java.lang.annotation.*; ... -
使用 Spring Data JPA 简化 JPA 开发(Spring Data JPA 开发指南)
2014-06-11 15:46 710从一个简单的 JPA 示例开始 本文主要讲述 Spring D ... -
My-sql批量更新或者插入的SQL
2013-09-25 17:03 1386My-sql批量更新或者插入的SQL,高效, MyBatis中 ... -
加减的艺术用于工作学习管理
2013-02-17 17:12 746回顾做过的事情,总结起来,就是先加,后减,再加。 不是吗? ... -
记录到内存的Logger,可用于web动态显示内容的来源
2013-02-17 09:35 1835import java.io.ByteArrayOutputS ... -
ms-sql-server获取某表的当前可用的自增值
2012-01-10 09:46 920执行 SQL : select IDENT_CURRENT( ... -
一个加密数字和逗号且减少空间的算法
2010-11-09 17:19 1336注意本算法只能处理由 0,1,2,3,4,5,6,7,8, ... -
云计算笔记
2010-09-01 14:13 809最近得闲,去了解下 hadoop系统,下面为过程记录: 1、 ... -
在MySql上实现Replication(Master 与 Slave 数据同步)
2010-04-23 17:54 1149假设这里有三个数据库分别为 d1、d2、d3,其中d ... -
在一台windows机器上如何安装多个Mysql
2010-04-23 17:41 34161、将mysql程序直接拷贝到某个目录(假设目录为d:\mys ... -
MySQL复制配置步骤文档(主从备份机制)
2010-03-30 10:14 1880本文档主要对一个主服务器,一个从服务器(简称一主一从)的复制配 ... -
如何得到SqlServer的自增ID
2010-03-16 11:09 5958转自:http://hi.baidu.com/vc60/blo ... -
J2EE集群
2010-01-04 15:29 3633对于理解J2EE集群技术不 ... -
JDBC 调用存储过程的整理
2010-01-04 14:30 1054String sqls = this.getSqls().ge ... -
Jboss下设置一个web-app
2009-12-18 14:06 1178<!--StartFragment --> 虚拟 ...
相关推荐
作为一个表达式计算工具,它的核心任务是接受用户的输入,这个输入可以是一个简单的数学公式,如2+2,也可以是复杂的复杂数学表达式,如sin(x^2) + cos(y^3)。工具会将这些表达式解析成计算机可理解的形式,然后执行...
1、VC实现的数学表达式计算工具。该工具可以计算复杂表达式,支持开方,幂运算等; 2、程序中将表达式计算模块化封装成动态库,使用时可以方便的将表达式计算功能加入到自己的程序中。
本文将深入探讨一款由德国开发者设计的,基于VC++的免费开源函数表达式计算工具,它能够处理多种数学运算,包括四则运算、括号管理和三角函数等,是程序员和数学爱好者理想的计算辅助软件。 首先,我们要理解的是...
vs2012实现的一个控制台小程序,用于算术表达式计算功能。
在Delphi中处理表达式计算是一项常见的任务,尤其是当你需要动态地根据某些条件来评估数学或逻辑表达式时。标题提到的“Delphi表达式计算”是指在Delphi程序中实现对用户输入或程序内部生成的表达式的求值。 Delphi...
为了简化这一过程,存在专门的控件,如Formula,它是一个高效且功能丰富的表达式计算组件。Formula控件能够帮助开发者处理各种数学函数,并且具有较高的计算效率。 Formula控件的主要特点在于其强大的表达式解析和...
**Java算术表达式计算类库 ExpressionJ** ExpressionJ是一个强大的Java库,专门设计用于解析和计算数学算术表达式。这个库对于那些在应用程序中需要动态计算复杂数学表达式的开发者来说,是一个非常有用的工具。它...
在易语言中,表达式计算公式解析是编程过程中一个重要的环节,它涉及到对数学表达式的处理、计算以及错误检查等复杂任务。 表达式计算公式解析的核心在于解析器,这个解析器会将用户输入的字符串形式的表达式转化为...
总的来说,这款“计算器,支持表达式计算”项目不仅是一个实用的工具,也是一个学习Win32编程和表达式计算的好例子。无论是对于初学者还是有一定经验的开发者,都能从中获取有价值的知识和实践经验。
总的来说,C#提供了强大的工具来处理表达式计算,无论是简单的算术运算还是复杂的动态表达式。了解并熟练运用这些概念对于开发高效、灵活的.NET应用程序至关重要。通过不断的实践和学习,你将能够更好地掌握C#表达式...
本文将深入解析一个C语言实现的表达式计算代码,该代码能够处理基本的算术运算(包括加、减、乘、除)以及括号运算,甚至支持对特定常量如π的识别。 #### 关键技术点 1. **使用栈结构管理运算符和操作数:** ...
在C++编程中,实现数学表达式计算是一个常见的需求,特别是在科学计算、工程应用和游戏开发等领域。这个项目显然旨在创建一个能够解析和求解包含常见数学函数的数学表达式的库。下面我们将深入探讨实现这样的功能所...
自己写的一个计算字符串表达式工具类; Java 工具类, 计算字符串表达式, 支持 +,-,*,/,%. ()
本压缩包文件“数字电路逻辑表达式计算.zip”提供了一个用于计算逻辑表达式值的工具,包括源代码“数字电路逻辑表达式计算.cpp”和编译后的可执行文件“数字电路逻辑表达式计算.exe”。 **布尔代数**: 布尔代数,...
真人发音新计算器4.1.0多功能、多行、表达式计算工具,最简单易用的多功能、多行、表达式计算工具,操作就如计事本软件,不用学就会用,好象是你在一张白纸上写计算式,电脑自动填入结果,而且每次的计算都还保留着...
- 在中缀表达式计算中,我们用一个栈存储运算符,另一个栈存储中间结果。 2. **算法步骤**: - 从左到右扫描中缀表达式。 - 遇到数字时,将其压入结果栈。 - 遇到运算符时,比较其优先级与栈顶运算符的优先级:...
总的来说,C语言表达式计算是一个涵盖广泛的话题,包括运算符优先级、结合性、内建函数的使用、字符串表达式的解析等。理解这些概念对于编写高效和准确的C语言代码至关重要。在实际项目中,开发者需要根据需求选择...
本项目"Swift 表达式计算机"就是利用Swift实现的一个功能完备的计算工具,它特别采用了逆波兰表示法(Reverse Polish Notation, RPN)以及栈数据结构来解析和计算数学表达式。以下是对这个项目的详细解析: 1. **逆...
总的来说,这个"VC 函数表达式计算源码实例"是一个很好的学习资源,可以帮助开发者提升在算法设计、数据结构和C++编程方面的技能。通过阅读和理解源代码,你可以深入了解表达式计算的内部机制,并将其应用到自己的...