java算法計算一元一次方程


java算法計算一元一次方程是昨年10月寫的了,最近想寫寫算法就把它整理出來了。

核心思想是將方程轉化為:aX+b = cX+d 的形式再進行計算,轉化的思想是根據符號的優先級一層一層的分割。分割規則是先把+號能分割完的分割完,再把-號能分割完的分割完,最后分割*/號,不能從括號里面分割。具體過程如下:

方程:-3-12+2*(-7+5x)=-3-4+3*(6x+9)+10*3-20-30,以左邊為例:

先根據 + 號 分割,結果為:

左:-3-12                              +                             右: 2*(-7+5x)

左邊只能根據 - 號分割,右邊根據*號分割

左:左:-3    -    右:12         +                             右: 左:2         *       右:-7+5x

左邊,右邊都是 aX+b 形式直接計算,-3也是aX+b形式(a=0,b=-3)

左:-15                                  +                             右:-14+10x

最后左側將轉化為:10x-29

完整代碼如下:

/** * Created by LL on 2016/10/13. */ public class yiyuanyicifangcheng { public static void main(String[] args) { String string="-3-12+2*(-7+5x)=-3-4+3*(6x+9)+10*3-20-30"; double result = calculate(string); System.out.println("計算結果:x = "+result); } /** * 此類方法用於將字符串化為: aX+b 結構,結果返回a,b * @param str:需要計算的字符串 */ public static Result translate(String str) { str=deleteKH(str); char[] chars = str.toCharArray(); //先根據 + 號 將字符串分割完 for (int i = 0, kuHaoNum = 0; i < chars.length; i++) { kuHaoNum = getBracketsNum(kuHaoNum,i,chars); if(kuHaoNum==0&&("+".equals(chars[i]+""))){ //括號里面不分割 String s01=str.substring(0,i); String s02=str.substring(i+1, str.length()); Result result01=getResultFromString(s01); Result result02=getResultFromString(s02); Result result=new Result(); result.setA(result01.getA()+result02.getA()); result.setB(result01.getB()+result02.getB()); return result; } } //再根據 - 號 將字符串分割完 注意:- 號是從后往前分割 for (int i=chars.length-1,kuHaoNum=0;i>=0 ;i--) { kuHaoNum = getBracketsNum(kuHaoNum,i,chars); if(kuHaoNum==0&&("-".equals(chars[i]+""))){ //括號里面不分割 String s01=str.substring(0,i); String s02=str.substring(i+1, str.length()); Result result01=getResultFromString(s01); Result result02=getResultFromString(s02); Result result=new Result(); result.setA(result01.getA()-result02.getA()); result.setB(result01.getB()-result02.getB()); return result; } } //最后根據 *,/ 號 將字符串分割 for(int i=0,kuHaoNum=0;i<chars.length;i++){ kuHaoNum = getBracketsNum(kuHaoNum,i,chars); if(kuHaoNum==0&&("*".equals(chars[i]+"")||"/".equals(chars[i]+""))){ //括號里面不分割 String s01=str.substring(0, i); String fuhao=str.substring(i, i+1); String s02=str.substring(i+1, str.length()); Result result01=getResultFromString(s01); Result result02=getResultFromString(s02); Result result=new Result(); if(fuhao.equals("*")){ //因為是一元一次方程 不會出現 (aX+b)*(aX+b)的情況 if(result01.getA()!=0){ result.setA(result01.getA()*result02.getB()); result.setB(result01.getB()*result02.getB()); } if(result02.getA()!=0){ result.setA(result01.getB()*result02.getA()); result.setB(result01.getB()*result02.getB()); } if(result01.getA()==0&&result02.getA()==0){ result.setA(0.0); result.setB(result01.getB()*result02.getB()); } }else if(fuhao.equals("/")){ result.setA(result01.getA()/result02.getB()); result.setB(result01.getB()/result02.getB()); } return result; } } return null; } /** * 此類方法用於獲取從起始位置到當前位置經歷了幾個括號 * @param num:括號數量 * @param index:字符數組的位置 * @param chars:字符數組 */ public static int getBracketsNum(int num,int index,char[] chars){ if("(".equals(chars[index]+"")){ num++; }else if(")".equals(chars[index]+"")){ num--; } return num; } /** * 此類方法用於將字符串轉化為 aX+b 的形式 返回 Result * @param str:需要轉化的字符串 */ public static Result getResultFromString(String str){ Result result = new Result(); if(str.equals("")){ result.setA(0.0); result.setB(0.0); }else if(isRightString(str)){ String standString=getStandardFormatString(str); standString=deleteKH(standString); result.setA(Double.parseDouble(standString.substring(0,standString.indexOf("x")))); result.setB(Double.parseDouble(standString.substring(standString.indexOf("x")+1,standString.length()))); }else if (isNum(str)){ result.setA(0.0); result.setB(Double.parseDouble(str)); }else{ result=translate(str); } return result; } /** * 此類方法用於計算方程 * @param string:需要計算的方程 */ public static double calculate(String string){ String string01=string.substring(0,string.indexOf("=")); String string02=string.substring(string.indexOf("=")+1,string.length()); Result result01=translate(string01); Result result02=translate(string02); System.out.println("原方程為:"+string); System.out.println("轉化后的標准格式為:"+result01.getA()+"x+("+result01.getB()+")="+result02.getA()+"x+("+result02.getB()+")"); double a1=result01.getA(); double b1=result01.getB(); double a2=result02.getA(); double b2=result02.getB(); if(a1==a2&&b1!=b2){ System.out.println("此方程無解"); }else if(a1==a2&&a1==b2){ System.out.println("此方程有任意解"); }else if(a1!=a2){ return (b2-b1)/(a1-a2); } return 0.0; } /** * 此類方法用於判斷字符串是否是數字 * @param str:需要判斷的字符串 */ public static boolean isNum(String str){ boolean isNum = true; try{ double d = Double.parseDouble(str); }catch (Exception e){ isNum = false; } return isNum; } /** * 此類方法用於判斷字符串是否是類似於 aX+b 格式 * @param s:需要判斷的字符串 */ public static boolean isRightString(String s){ char[] c=s.toCharArray(); int j=0; for(int i=0;i<c.length;i++){ if("+".equals(c[i]+"")||"-".equals(c[i]+"")){ j++; } } if(s.contains("x")&&j<=1){ if(!s.contains("(")){ return true; }else if(s.contains("(")&&s.indexOf("(")==0){ return true; } } return false; } /** * 此類方法用於將字符串轉化為 aX+b 標准格式 * @param s:需要轉化的字符串 */ public static String getStandardFormatString(String s){ char[] c=s.toCharArray(); int t=0; StringBuffer s1=new StringBuffer(s); if(s.contains("+")||s.contains("-")){ for(int i=0;i<c.length;i++){ if("+".equals(c[i]+"")||"-".equals(c[i]+"")){ t=i;//t 用於記住 +,-號的位置 break; } } if(s.indexOf("x")<t){ return s; }else{ String s2=s.substring(0,t); String s3=s.substring(t,s.length()); StringBuffer ss=new StringBuffer(s3); ss.append(s2); return ss.toString(); } }else{ return s1.append("+0").toString(); } } /** * 此類方法用於去掉字符串最外層的括號 * @param str:需要處理的字符串 */ public static String deleteKH(String str){ if(str.startsWith("(")&&str.endsWith(")")){ str = str.substring(1, str.length() - 1); } return str; } /** * 此類定義了 aX+b 結構中的 a和b * 注意 這里的a,b可以為負,即aX-b也屬於這種結構 */ public static class Result{ double a; double b; public Result(){ } public Result(double a,double b) { this.a=a; this.b=b; } public double getA() { return a; } public double getB() { return b; } public void setA(double a) { this.a = a; } public void setB(double b) { this.b = b; } @Override public String toString() { return "Result{" + "a=" + a + ", b=" + b + '}'; } } }

 

運行結果:

這里寫圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM