天天看點

java 算方程_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

完整代碼如下:

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);

}

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

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;

}

public static int getBracketsNum(int num,int index,char[] chars){

if("(".equals(chars[index]+"")){

num++;

}else if(")".equals(chars[index]+"")){

num--;

}

return num;

}

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;

}

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;

}

public static boolean isNum(String str){

boolean isNum = true;

try{

double d = Double.parseDouble(str);

}catch (Exception e){

isNum = false;

}

return isNum;

}

public static boolean isRightString(String s){

char[] c=s.toCharArray();

int j=0;

for(int i=0;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;

}

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

if("+".equals(c[i]+"")||"-".equals(c[i]+"")){

t=i;//t 用于記住 +,-号的位置

break;

}

}

if(s.indexOf("x")

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();

}

}

public static String deleteKH(String str){

if(str.startsWith("(")&&str.endsWith(")")){

str = str.substring(1, str.length() - 1);

}

return str;

}

public static class Result{

double a;

double b;

public Result(){

}