1234567890中间加上+、-、*、/或者""后变成的等式结果为110

2 篇文章 0 订阅
2 篇文章 0 订阅
package org.lw.test;

import java.util.ArrayList;
import java.util.List;

/**
 * 1234567890中间加上+、-、*、/或者""后变成的等式结果为110
 * @author 古市轩
 * @时间 2012-4-28下午 07:41:22
 */
public class Test111 {

	public static void main(String[] args) {

		String str = "123456789";
		output(str);
	}

	// 根据算式截取运算符
	public static List<Character> getOperation(String str) {
		if (!"".equals(str)) {
			List<Character> list = new ArrayList<Character>();
			for (int i = 0; i < str.length(); i++) {
				if (str.charAt(i) == '+' || str.charAt(i) == '-'
						|| str.charAt(i) == '*' || str.charAt(i) == '/') {
					list.add(str.charAt(i));
				}
			}
			return list;
		} else {
			return null;
		}
	}

	// 根据算式截取操作数
	public static List<Long> getOperationNumber(String str) {
		if (!"".equals(str)) {
			List<Long> list = new ArrayList<Long>();
			String[] s = str.split("\\+|-|\\*|/|&|=|(>=)|(<=)");
			for (int i = 0; i < s.length; i++) {
				list.add(Long.parseLong(s[i]));
			}
			return list;
		} else {
			return null;
		}
	}

	// 根据只有加减运算的等式计算结果
	public static Long getResult(String str) {

		Long result = -1L;
		if (str.contains("+") || str.contains("-")) {
			List<Character> operations = getOperation(str);
			List<Long> operationNumbers = getOperationNumber(str);
			result = operationNumbers.get(0);
			for (int i = 0; i < operations.size(); i++) {
				char ch = operations.get(i);
				switch (ch) {
				case '+':
					result = result + operationNumbers.get(i + 1);
					break;
				case '-':
					result = result - operationNumbers.get(i + 1);
				}
			}
		}
		return result;
	}

	// 把等式的乘除运算计算完后返回只剩加减运算的等式,即把含有乘法和除法的等式装换成只含有加法和减法的等式
	public static String getAddAndSubString(String str) {

		StringBuilder sb = new StringBuilder();
		if (str.contains("*") || str.contains("/")) {
			List<Character> operations = getOperation(str);
			List<Long> operationNumbers = getOperationNumber(str);

			for (int i = 0; i < operations.size(); i++) {
				Long temp = 0L;
				switch (operations.get(i)) {
				case '*':
					temp = operationNumbers.get(i);
					temp = temp * operationNumbers.get(i + 1);
					operations.remove(i);
					operationNumbers.remove(i);
					operationNumbers.remove(i);
					operationNumbers.add(i, temp);
					i--;
					break;
				case '/':
					temp = operationNumbers.get(i);
					if (operationNumbers.get(i + 1) != 0
							&& operationNumbers.get(i)
									% operationNumbers.get(i + 1) == 0) {
						temp = temp / operationNumbers.get(i + 1);
						operations.remove(i);
						operationNumbers.remove(i);
						operationNumbers.remove(i);
						operationNumbers.add(i, temp);
						i--;
					} else {
						return "";
					}
				}
			}
			if (operations.size() != 0) {
				sb.append(operationNumbers.get(0));
				for (int i = 0; i < operations.size(); i++) {
					sb.append(operations.get(i)).append(
							operationNumbers.get(i + 1));
				}
				return sb.toString();
			} else {
				return operationNumbers.get(0).toString();
			}

		} else {
			return str;
		}
	}

	// 判断是否符合要求并输出
	public static void output(String str) {

		for (int i = 0; i < Math.pow(5, str.length() - 1); i++) {
			StringBuilder sb = new StringBuilder(str);
			String s = Integer.toString(i, 5); // 转换成5进制
			for (int j = 0; j < s.length(); j++) {
				if ('1' == s.charAt(s.length() - j - 1)) {
					sb.insert(s.length() - j, '+');
				} else if ('2' == s.charAt(s.length() - j - 1)) {
					sb.insert(s.length() - j, '-');
				} else if ('3' == s.charAt(s.length() - j - 1)) {
					sb.insert(s.length() - j, '*');
				} else if ('4' == s.charAt(s.length() - j - 1)) {
					sb.insert(s.length() - j, '/');
				}
			}
			String string = sb.toString();
			String newString = getAddAndSubString(string);

		    if (getResult(newString) == 110L) {
		    	System.out.println(string + " = 110");
		    }
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值