华为机试等式变换

题目描述:

输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。

1 2 3 4 5 6 7 8 9 = X

比如:

12-34+5-67+89 = 5

1+23+4-5+6-7-8-9 = 5

请编写程序,统计满足输入整数的所有整数个数。

输入:       正整数,等式右边的数字

输出:       使该等式成立的个数

样例输入:5

样例输出:21(此处是21,不是23

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

/**
 * 输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。 1 2 3 4 5 6 7 8 9 = X 比如:
 * 12-34+5-67+89 = 5 1+23+4-5+6-7-8-9 = 5 请编写程序,统计满足输入整数的所有整数个数。 输入: 正整数,等式右边的数字
 * 输出: 使该等式成立的个数 样例输入:5 样例输出:23
 * 
 * */
public class EquationTran {
	public static void main(String[] args) {
		transfer(5);
	}

	/*1、
	 * 1 2 3 4 5 6 7 8 9中间有8个位置可以用来填充符号+,-或空。0代表+,1代表-,2代表空
	 * 采用三进制则符号位的表达式从00000000——22222222。转为十进制是0——6560,共6561中可能
	 *2、那么就有6561中计算表达式。穷举这6561中表达式,并计算结果,与输入数字相等的,则输出
	 */
	
	public static void transfer(int number){
		//定义哈希表存放符号情况
//		采用三进制则符号位的表达式从00000000——22222222。转为十进制是0——6560,共6561中可能
		final int table_size=6561;
		String equation="1 2 3 4 5 6 7 8 9";
		String equationTran;
		int count=0;//符合的表达式的个数
		for (int i = 0; i < table_size; i++) {
			String symbol=get_3x(i);
			StringBuilder sb=new StringBuilder(equation);
			for (int j = 0; j < 8; j++) {
				//0代表+,1代表-,2代表空
				char temp=symbol.charAt(j);
				if(temp=='0'){
					sb.replace(j*2+1, j*2+2, "+");
				}else if(temp=='1'){
					sb.replace(j*2+1, j*2+2, "-");
				}
			}
			equationTran=sb.toString().replaceAll(" ", "");//将空格去掉
			
			//判断表达式计算值是否与输入的值相等
			if(equal(equationTran,number)){
				count++;
				System.out.println(equationTran);
			}
		}
		System.out.println(count);
	}
	
	
	
	
	
	
	
	
	private static boolean equal(String equationTran, int number) {
		if(!equationTran.contains("+")&&!equationTran.contains("-")){//当前的equationTran为123456789
			if(Integer.valueOf(equationTran)==number)
				return true;
			else
				return false;
		}else{
			StringTokenizer st = new StringTokenizer(equationTran,"+,-",true);//分割字符串
			List<String> list=new ArrayList<String>();
			while(st.hasMoreElements()){
				list.add((String) st.nextElement());
			}
			int i=0;
			int result=Integer.valueOf(list.get(0));//第一个数
			for (i=1;i<list.size();) {
				String str=list.get(i);
				if("+".equals(str)){
					result+=Integer.valueOf(list.get(i+1));
				}else if("-".equals(str)){
					result-=Integer.valueOf(list.get(i+1));
				}
				i+=2;
			}
			if(result==number)
				return true;
			else
				return false;
		}
	}

	/**
	 * @param i
	 * @return
	 * 将对应的整型数字转为3进制符号表达式
	 */
	private static String get_3x(int i) {
		StringBuilder sb=new StringBuilder();
		int remain=0;
		int number=i;
		while(number>=3){
			remain=number%3;
			sb.append(remain);
			number=number/3;
		}
		sb.append(number);
		int len=sb.length();
		for (int j = 0; j < 8-len; j++) {
			sb.append(0);
		}
		String symbol=sb.reverse().toString();
		return symbol;
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值