Java之实现给定四个数计算出一个给定的数

Java之实现给定四个数计算出一个给定的数

开发工具与关键技术:Java[MyEclipse 10]
作者:谢景
撰写时间:2019-5-6

曾经,遇到一个问题,就是给定五个数,如何用前面四个数加减乘除得出最后一个数。
现在,我想用Java实现这个功能。
前期思路:

  1. 将运算符保存到数组
  2. 用循环将数组的运算符代入算式中计算
    例如:
    在这里插入图片描述
    但是我们写代码的时候会发现这方法不可行,因为运算符一旦已字符串保存到数组里面就没有原自身的功能。
    思路二、
    一步一步算,例如有四个4,我们先循环计算两个4,然后用结果和第三个4计算,再用结果跟第四个4计算。
    但是我们又很容易发现这样也不可行,例如4+4*4-4得出的结果是28,可正确结果为16。

经过一番冥思苦想得出思路:

  1. 用循环将运算符代入算式中,保存为字符串型
  2. 写个方法,遍历字符串的运算符,判断是否是乘除运算符,如果是,则先计算,用结果代替运算符和运算符前后的数 ,例如4+44-4,遍历运算符时计算结果为16,然后用16代替,代替之后算式为4+16-4
  3. 写个方法,再遍历运算符,将加减运算符字符串给替换成有意义的运算符并运算结果。
  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);

上述调用结果如下:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值