基本思想是:先从最里面开始计算,找到最后一个“(”和第一个“)”,提取里面的的式子计算并去其外面一层括号,再把结果以字符串的形式带回被计算的无括号式子的位置,对新式子进行循环上面的操作,指导最外层。无括号式子有else if 对优先级处理,找到第一个优先级高的计算符,通过两个函数分别计算计算符前面的数值长度和后面的数值长度,把两个数值字符串转换值,计算后结果以字符串形式回带到原式子中,循环直到无计算符为止。
import java.util.Scanner;
public class caculate_str {
static Scanner in=new Scanner(System.in);
//式子计算
public static double caculate(String str){
int p1,p2;
p2=str.indexOf(")");
if(p2==-1)p2=str.length();
while(true){
p1=str.substring(0, p2).lastIndexOf("(");
if(p1==-1)break;
str=str.substring(0, p1)+caculat(str.substring(p1+1, p2))+str.substring(p2+1);
if(p2!=str.length())p2=str.indexOf(")");
if(p2==-1)p2=str.length();
}
return Double.parseDouble(caculat(str));
}
//无括号式子计算
public static String caculat(String str){
int p,l,l2;
double sum=0;
while(str.length()!=num_alenth(str)){
if(str.indexOf("√")!=-1){
p=str.indexOf("√");
l=num_alenth(str.substring(p+1));
sum=Double.parseDouble(str.substring(p+1, p+1+l));
sum=java.lang.Math.sqrt(sum);
str=str.substring(0, p)+sum+str.substring(p+1+l);
}else if(str.indexOf("%")!=-1){
p=str.indexOf("%");
l=num_blenth(str.substring(0,p));
sum=Integer.parseInt(str.substring(p-l, p));
l2=num_alenth(str.substring(p+1));
sum=((int)sum)%Integer.parseInt(str.substring(p+1, p+1+l2));
str=str.substring(0, p-l)+sum+str.substring(p+1+l2);
}else if(str.indexOf("÷")!=-1){
p=str.indexOf("÷");
l=num_blenth(str.substring(0,p));
sum=Double.parseDouble(str.substring(p-l, p));
l2=num_alenth(str.substring(p+1));
sum/=Double.parseDouble(str.substring(p+1, p+1+l2));
str=str.substring(0, p-l)+sum+str.substring(p+1+l2);
}else if(str.indexOf("×")!=-1){
p=str.indexOf("×");
l=num_blenth(str.substring(0,p));
sum=Double.parseDouble(str.substring(p-l, p));
l2=num_alenth(str.substring(p+1));
sum*=Double.parseDouble(str.substring(p+1, p+1+l2));
str=str.substring(0, p-l)+sum+str.substring(p+1+l2);
}
else if(str.indexOf("-")!=-1){
p=str.indexOf("-");
l=num_blenth(str.substring(0,p));
sum=Double.parseDouble(str.substring(p-l, p));
l2=num_alenth(str.substring(p+1));
sum-=Double.parseDouble(str.substring(p+1, p+1+l2));
str=str.substring(0, p-l)+sum+str.substring(p+1+l2);
}else if(str.indexOf("+")!=-1){
p=str.indexOf("+");
l=num_blenth(str.substring(0,p));
sum=Double.parseDouble(str.substring(p-l, p));
l2=num_alenth(str.substring(p+1));
sum+=Double.parseDouble(str.substring(p+1, p+1+l2));
str=str.substring(0, p-l)+sum+str.substring(p+1+l2);
}
}
return str;
}
//计算符后的数值长度
public static int num_alenth(String str){
int n;
String isnum="-.0123456789";//判断是否数值
String s=str.substring(0,1);
for( n=0;n0;s=str.substring(n,n+1)){
if(isnum.indexOf(s)==-1){n++;break;}
n--;
}
return str.length()-n;
}
public static void main(String args[]){
String s="";
s="(11+11)-22×22";
System.out.println(caculate(s));
}
}
本文档为【java算式计算】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。