Java之实现给定四个数计算出一个给定的数
Java之实现给定四个数计算出一个给定的数
开发工具与关键技术:Java[MyEclipse 10]
作者:谢景
撰写时间:2019-5-6
曾经,遇到一个问题,就是给定五个数,如何用前面四个数加减乘除得出最后一个数。
现在,我想用Java实现这个功能。
前期思路:
- 将运算符保存到数组
- 用循环将数组的运算符代入算式中计算
例如:
但是我们写代码的时候会发现这方法不可行,因为运算符一旦已字符串保存到数组里面就没有原自身的功能。
思路二、
一步一步算,例如有四个4,我们先循环计算两个4,然后用结果和第三个4计算,再用结果跟第四个4计算。
但是我们又很容易发现这样也不可行,例如4+4*4-4得出的结果是28,可正确结果为16。
经过一番冥思苦想得出思路:
- 用循环将运算符代入算式中,保存为字符串型
- 写个方法,遍历字符串的运算符,判断是否是乘除运算符,如果是,则先计算,用结果代替运算符和运算符前后的数 ,例如4+44-4,遍历运算符时计算结果为16,然后用16代替,代替之后算式为4+16-4
- 写个方法,再遍历运算符,将加减运算符字符串给替换成有意义的运算符并运算结果。
- 返回结果
下面是具体代码实现:
第一步、写方法,给调用者传参调用并在方法里将参数拼接成字符串
public void oper(int a, int b, int c, int e,int sum) {
//声明数组,存放运算符字符
String[] d = { "+", "-", "*", "/" };
//声明字符串,存放拼接之后的字符串
String str = "";
Jjcc jjcc = new Jjcc();
//第一次循环,前面两个数中的运算符
for (int i = 0; i < 4; i++) {
str = "";
//第二次循环,中间两个数的运算符
for (int j = 0; j < 4; j++) {
//第三次循环,最后两个数的运算符
for (int j2 = 0; j2 < 4; j2++) {
//将数字和运算符进行拼接
str = a + d[i] + b + d[j] + c + d[j2] + e;
//将字符串作为参数调用Jjcc类的jisuan方法,用字符串接收返回值,方法返回的是算式的结果
String sum1=jjcc.jisuan(str);
//判断算式的结果跟给定的结果是否一致,是则输出算式和结果
//之所以用浮点类型Float,是因为除法可能会出现小数,防止计算误差所以使用浮点型
if (Float.valueOf(sum1).equals((float)sum)) {
System.out.println(str + "=" + sum1);
}
}
}
}
}
第二步、实现上面方法中的Jjcc类的jisuan方法:
class Jjcc {
public String jisuan(String str) {
// String
//声明字符串类型的list列表,存放算式分割之后的字符
List<String> list = new ArrayList<String>();
//分割算式
String[] arrstr = str.split("");
//将分割之后的字符存到list列表
for (int p = 0; p < arrstr.length; p++) {
list.add(p, arrstr[p]);
}
//移除list列表的第一个值,因为分割之后最前面会分割出一个空的字符
list.remove(0);
//循环6次,防止算式中出现三个乘除运算或三个加减运算,确保最后的值是最终结果
for (int i = 0; i < 6; i++) {
if (i < 3) {
//前三次调用liststr方法,参数是list列表
list = liststr(list);
} else {
//后三次调用liststr1方法,参数是list列表
list = liststr1(list);
}
}
//返回最终结果
return list.get(0);
}
第三步、实现第二步的liststr方法和liststr1方法
public static List<String> liststr(List<String> list) {
//循环list列表的数据,i += 2是只循环运算符
for (int i = 1; i < list.size(); i += 2) {
//声明浮点变量,存放计算的结果值
float fl;
//判断运算符是否是乘法运算符
if (list.get(i).toString().trim().equals("*")) {
//如果遍历的运算符是乘法运算符,则计算运算符前后数字运算的结果
fl = Float.parseFloat(list.get(i - 1))
* Float.parseFloat(list.get(i + 1));
//先移除运算符和运算前后的数值,之所以三次移除i-1,是因为移除了i-1之后原本i就是i-1
//例如:123,假如i为1,我们移除i-1,就是移除了1,那么移除之后2的位置就是第一位,此时我们要移除2只需再移除i-1即可
list.remove(i - 1);
list.remove(i - 1);
list.remove(i - 1);
//将结果插入i-1的位置
list.add(i - 1, Float.toString(fl));
break;
} else if (list.get(i).toString().trim().equals("/")) {
//原理同上
fl = Float.parseFloat(list.get(i - 1))
/ Float.parseFloat(list.get(i + 1));
list.remove(i - 1);
list.remove(i - 1);
list.remove(i - 1);
list.add(i - 1, Float.toString(fl));
break;
}
}
//返回list列表
return list;
}
//原理同上
public static List<String> liststr1(List<String> list) {
for (int i = 1; i < list.size(); i += 2) {
float fl;
if (list.get(i).toString().trim().equals("+")) {
fl = Float.parseFloat(list.get(i - 1))
+ Float.parseFloat(list.get(i + 1));
list.remove(i - 1);
list.remove(i - 1);
list.remove(i - 1);
list.add(i - 1, Float.toString(fl));
break;
} else if (list.get(i).toString().trim().equals("-")) {
fl = Float.parseFloat(list.get(i - 1))
- Float.parseFloat(list.get(i + 1));
list.remove(i - 1);
list.remove(i - 1);
list.remove(i - 1);
list.add(i - 1, Float.toString(fl));
break;
}
}
return list;
}
第四步、调用方法,验证功能
Operation operation=new Operation();
operation.oper(4, 4, 4 ,4,16);
上述调用结果如下: