四则运算算法问题

问题描述

小弟初学java,从网上找了一个四则运算的代码,发现有两个公式没法运行:(A/(B+C)-D)((A-B*C)/D)想请教下到底是什么原因,谢谢了!关于运算的程序如下:ackagecom.example.poker24;publicclassCalculate{privatestaticintintercePosition=0;//记录单个运算数据的长度privatestaticint[]intercePositionIndex=null;//记录“(”的下标privatestaticint[]intercePositionEnd=null;//记录“)”的下标publicstaticStringcalculate(Stringstr){//if(ispassString(str)==false){//return);returninterceResult(str);}//判断是否有带括号的运算字符串存在privatestaticStringinterceResult(Stringstr){Stringresult=str;char[]numberString=str.toCharArray();//1+2+(1*2+1-1*2+5)+2+(1+5+9+10-11)+1*5/2+3//1+8-9+(1*8/2-5+(1+2+8))+4/5*8/3*2intIndexStart=0;//记录“(”的实际数量intEndStart=0;//记录“)”的实际数量for(inti=0;i<numberString.length;i++){if('('==numberString[i]){//记录最后一个正括号的位置IndexStart=i;}if(')'==numberString[i]){//记录反括号的最初始下标的位置EndStart=i;//截取最里面一个括号里的运算字符串result=result.substring(IndexStart+1,EndStart);//截取括号的运算字符串进行运算,生成新的运算字符串result=str.substring(0,IndexStart)+interceptOperation(result,'*','/')+str.substring(EndStart+1,str.length());//回调执行,其它小括号的运算字符串returninterceResult(result);}if(i==numberString.length-1)if(EndStart==0)break;}//不存在括号了,再进行混合运算result=interceptOperation(str,'*','/');returnresult;}//不带括号的四则运算privatestaticStringinterceptOperation(StringoperationNumber,chara,charb){Stringmess=operationNumber;char[]stringOperation=mess.toCharArray();//循环遍历运算字符串,并做相应的运算for(inti=0;i<stringOperation.length;i++){//判断运算符所在的索引if(stringOperation[i]==a||stringOperation[i]==b){if(i!=0){//运算符前的第一个数doublenum1=interceptNumIndex(mess.substring(0,i));//记录第一个数据的长度intfrontPosition=intercePosition;//运算符前的第二个数doublenum2=interceptNumEnd(mess.substring(i+1,stringOperation.length));//记录第二个数据的长度intbackPosition=intercePosition;//算完乘除,将结果替换到原来运算的位置,得到新的运算字符串StringIndexMess=mess.substring(0,i-frontPosition+1);StringIndexResult="";//判断是否运算到最后的结果了if(IndexMess.indexOf('+')==-1&&IndexMess.indexOf('*')==-1&&IndexMess.indexOf('/')==-1&&IndexMess.lastIndexOf('-')==-1)IndexMess="";if(IndexMess!="")IndexResult=IndexMess.lastIndexOf('-')==IndexMess.length()-1?IndexMess.substring(0,i-frontPosition):IndexMess;//组装新的运算字符串mess=IndexResult//mess.substring(0,i-frontPosition+1)+reslutString(""+stringOperation[i],num1,num2)+mess.substring(i+backPosition+1);//0.111/1212/2/2/2/2/2/2/2if(mess.lastIndexOf('-')==0&&mess.indexOf('+')==-1&&mess.indexOf('*')==-1&&mess.indexOf('/')==-1){break;}//回调,继续运算returninterceptOperation(mess,a,b);//1+7-5+89/3+4-6*8/2+4-6}elsecontinue;}if(i==stringOperation.length-1){//递归出口,判断是否还有运算字符串在if(mess.indexOf('+')!=-1||mess.indexOf('-')!=-1)returninterceptOperation(mess,'+','-');break;}}returnmess;}//截取第二个数privatestaticdoubleinterceptNumEnd(Stringstr){doublea=0;intInrerceIndex=0;char[]stringOperation=str.toCharArray();booleanispas=false;//记录是否为负数for(inti=0;i<stringOperation.length;i++){switch(stringOperation[i]){case'*':case'/':case'+':case'-':InrerceIndex=i;if(i!=0)//判断该数是否为负数ispas=true;break;default:break;}if(ispas)break;}//判断此数据是否在运算字符串的最后一位if(InrerceIndex==0){a=Double.parseDouble(str);intercePosition=str.length();if(ispas)intercePosition++;}else{a=Double.parseDouble(str.substring(0,InrerceIndex));//记录数据的真实长度intercePosition=str.substring(0,InrerceIndex).length();}returna;}//截取第一个数privatestaticdoubleinterceptNumIndex(Stringstr){doublea=0;//记录数据intInrerceIndex=0;//记录运算符的位置booleantemp=false;//记录数据前运算符的状态char[]stringOperation=str.toCharArray();for(inti=stringOperation.length-1;i>=0;i--){switch(stringOperation[i]){case'*':case'/':case'+':case'-':InrerceIndex=i;temp=true;break;default:break;}if(temp)break;}//判断此数据是否在运算字符串的第一位if(InrerceIndex==0){a=Double.parseDouble(str);intercePosition=str.length();//if(temp)//intercePosition++;}else{a=Double.parseDouble(str.substring(InrerceIndex,str.length()));//记录数据的真实长度intercePosition=str.substring(InrerceIndex,str.length()).length();}returna;}//计算结果privatestaticdoublereslutString(Stringoperation,doublenum1,doublenum2){doublesumResult=0;if(operation.equals("*"))sumResult=num1*num2;if(operation.equals("-"))sumResult=num1-num2;if(operation.equals("/"))sumResult=num1/num2;if(operation.equals("+"))sumResult=num1+num2;returnsumResult;}//判断是否正确输入运算方式publicstaticbooleanispassString(StringmessString){booleanispass=false;booleanoperationIspass=true;//记录被除数的状态intai=0;//记录是否有运算符号的存在char[]IsString=messString.toCharArray();intnum1=0;intnum2=0;for(inti=0;i<IsString.length;i++){//记录有几对小括号的存在if('('==IsString[i])num1++;if(')'==IsString[i])num2++;//判断除数是否为零if('/'==IsString[i]&&IsString[i+1]=='0')operationIspass=false;//判断是否输入了运算符合if(IsString[i]=='+'||IsString[i]=='-'||IsString[i]=='*'||IsString[i]=='/')ai++;if(i==IsString.length-1)if(ai==0)num2++;}if(operationIspass)if(num1==num2)ispass=true;returnispass;}}

解决方案

解决方案二:
这么长....
解决方案三:
好复杂啊
解决方案四:
中缀转后缀,然后用栈进行运算

时间: 2024-09-20 04:07:57

四则运算算法问题的相关文章

javascript中解析四则运算表达式的算法和示例_javascript技巧

在编写代码时我们有时候会碰到需要自己解析四则运算表达式的情况,本文简单的介绍使用JavaScript实现对简单四则运算表达式的解析. 一.熟悉概念 中缀表示法(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4).也就是我们最常用的算术表达式,中缀表达式对于人类来说比较容易理解,但是不易于计算机解析. 逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式

java实现任意四则运算表达式求值算法_C 语言

本文实例讲述了java实现任意四则运算表达式求值算法.分享给大家供大家参考.具体分析如下: 该程序用于计算任意四则运算表达式.如 4 * ( 10 + 2 ) + 1 的结果应该为 49. 算法说明: 1. 首先定义运算符优先级.我们用一个 Map<String, Map<String, String>> 来保存优先级表.这样我们就可以通过下面的方式来计算两个运算符的优先级了: /** * 查表得到op1和op2的优先级 * @param op1 运算符1 * @param op2

JavaScript 四则运算:加减乘除

这几天也在学习 javascript,前几日师傅给了一篇关于解析四则运算表达式和算法的文章,说四则运算很常用让我好好看看,再让编写代码看看最终结果. 首先我看了代码了解了两个关于算术或逻辑公式的表示法:中缀表示法以及逆波兰表示法,也学习了四则运算的实际转换过程(此定义在原文有详细解释). 原文:http://www.jb51.net/article/53537.htm   然后我看了作者写的代码,自己分析看明白后,再加了些代码.在这个过程中巩固学习了关于堆栈的知识以及栈(后进先出)和队列(先进先

不用加减乘除做加法的算法

题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为两个整数m和n(1<=m,n<=1000000). 输出: 对应每个测试案例,输出m+n的值. 样例输入: 3 4 7 9 样例输出: 7 16 思路: 1.先将各bit位相加,不计进位,这一步可以用m^n实现 2.加上进位,进位如何来,用m&n可以得到m和n中都为1的bit位,而不全为1的位则全部变为了0,该位相加会发生进位,使得左边

编译无错 运行不顺-VC6.0 小学生四则运算

问题描述 VC6.0 小学生四则运算 程序调试没有错误,就是运行不了 #include #include #include #include #include #include #include using namespace std; #define MaxSize 100 struct stud { string usename;//文件记录的用户名 string code;//文件记录的密码 int sumnum;//总题数 double percent;//正确率 string end;

【算法编程】随机数的不重复选择

       前一篇文章中,我们在Java中用实现两种不同接口的类,解决了不重复选择随机数的问题.现在我们在C++中,通过几种不同的算法来解决上述问题.在下面的四种算法实现中,用的随机函数都是C的库函数,这个函数产生的随机数的范围是限定的,[0, 32767].当然我们可以通过四则运算来改变取值范围.具体的算法实现如下: #include<iostream> #include<ctime> #include<algorithm> #include <set>

字符串四则运算-用c#编写一个程序,以最原始的方法进行两个字符串的四则运算

问题描述 用c#编写一个程序,以最原始的方法进行两个字符串的四则运算 字符串里面是数值,且不受字数限制. 如两个字符串相加"121343435"+"3453245",设计的程序是:个位与个位相加,满10进1,十位于十位相加... 如果设计的乘法,也是个位先和个位相乘...完了错开一位相加 采取最原始的方法,就像小学学习四则运算一样,一步一步进行 不能把字符串先转换为int等类型在进行运行,因为int类型储存数值长度短,这个程序设计的意义就是可以进行不受字数限制的四则

【算法编程】小学数学题难倒博士

昨天在科学网上得知这样一个新闻<越南小学数学题难倒博士>,据悉题目来自越南保禄小学三年班,不过报道称该题难倒了上至博士下至家长,未免也太言过其实了. 题目描述 学生需要在下图表格中按由上至下.从左到右的顺序,填入1~9的数字,可重复填写,并按先乘除后加减(图中冒号代表除法)的运算法则,完成整条算式. 解题方法 显然,这题对于我们这种程序员来说完全不是问题,只要在大一上过C语言的学生(我们学校全校都学过C,即使是文科专业)基本上都可以用九重for循环来穷举解出此题,下面我分别用C和Matlab实

算法之【仿竖式算法】

另类四则运算之大整数加减法: 十进制的数值运算在计算机里都将转换成二进制的数值运算,而二进制的运算就是cpu中最根本的逻辑运算,最后再转化成十进制输出.这次介绍的方法是保留十进制的运算方式(小学生的列竖式计算),仅仅将每位数字转换成二进制.这种算法既在速度上有所提升,又能克服单个数据存储大小的限制.因此可以用来进行大整数的加减法(大整数通常指16位或32位以上整型数).至于竖式计算的原理就不说了哦,不然有损大家的智商!   核心:模拟竖式计算,将大整数的每一位分开来存储与计算.   C语言完整程