zoukankan      html  css  js  c++  java
  • 等式变换java解法

    输入一个正整数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

    package huawei;
    
    import java.util.*;
    /**
     * 从数的角度看
     * @author Administrator
     */
    public class Equation1 {
    	
    	private static List<List<Integer>> list = new ArrayList<>();
    	
    	private static List<List<Integer>> op_list = new ArrayList<>();
    	//如若元素不是有序的则需用到
    	private static int [] ele = {1,2,3,4,5,6,7,8,9};
    	
    	private static int result = 5;
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		getResult(result);
    	}
    	
    	public static int getResult(int c) {
    		fun(9);
    		int count = 0;
    		System.out.println(op_list.size());
    		for(int k=0; k<list.size(); k++){
    			Integer [] ee = new Integer[list.get(k).size()];
    			op_list.clear();
    			fun_op(list.get(k).toArray(ee), list.get(k).size()-1);
    			//一组组合添加+或者-以后可能有的数组,计算其和
    			for(int i=0; i<op_list.size(); i++){
    				List<Integer> l = op_list.get(i);
    				int sum = 0;
    				for(int j=0; j<l.size(); j++){
    					sum+=l.get(j);
    				}
    //				System.out.print(sum+" ");
    				if(sum==result && l.get(0)>0){
    					count++;
    					System.out.println(l.toString());
    				}
    			}
    		}
    		System.out.println("count:"+count);
    		return count;
    	}
    	//所有数字有可能的组合
    	public static int fun(int c) {
    		if(c==1){
    			List gen = new ArrayList();
    			gen.add(1);
    			list.add(gen);
    			return 1;
    		}
    		int r = 0;
    		r = r + 2*fun(c-1);
    		
    		int k = list.size();
    		for(int i=0; i<k; i++){
    			List old = list.get(i);
    			List gen = new ArrayList(old);
    			gen.set(gen.size()-1, (int)(gen.get(gen.size()-1))*10 + c);
    			list.add(gen);
    			old.add(c);
    		}
    		return r;
    	}
    	//一组组合添加+或者-以后可能有的数组
    	public static int fun_op(Integer [] arr, int c){
    		if(c==0){
    			List gen1 = new ArrayList();
    			gen1.add(arr[c]);
    			List gen2 = new ArrayList();
    			gen2.add(-arr[c]);
    			op_list.add(gen1);
    			op_list.add(gen2);
    			return 2;
    		}
    		int r = 0;
    		r = r + fun_op(arr,c-1);
    		
    		int k = op_list.size();
    		for(int i=0; i<k; i++){
    			List old = op_list.get(i);
    			List gen = new ArrayList(old);
    			gen.add(-1*arr[c]);
    			op_list.add(gen);
    			old.add(arr[c]);
    		}	
    		return r;
    	}
    }
    

    package huawei;
    
    import java.util.ArrayList;
    import java.util.List;
    /**
     * 从符号的角度看
     * @author Administrator
     *
     */
    public class Equation2 {
    	
    	private static List<List<Integer>> list = new ArrayList<>();
    	
    	private static List<List> op_list = new ArrayList<>();
    	//如若元素不是有序的则需用到
    	private static int [] ele = {1,2,3,4,5,6,7,8,9};
    	
    	private static char [] op = {'+','-',' '};
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		getResult(5);
    	}
    	
    	public static int getResult(int c) {
    		int count = 0;
    		int r = fun_op(7);
    		System.out.println("r:"+r);
    		
    		for(int i=0; i<op_list.size(); i++){
    			List l = op_list.get(i);
    			int sum = 0;
    			
    			StringBuffer sizi = new StringBuffer();
    			sizi.append(ele[0]);
    			
    			int temp = ele[0];
    			for(int j=0; j<l.size(); j++){
    //				System.out.print(l.get(j));
    				char o = (char) l.get(j);
    				if(o=='+'){
    					sizi.append("+");
    				}else if(o=='-'){
    					sizi.append("-");
    				}
    				sizi.append(ele[j+1]);
    			}
    			if(i<10){
    				System.out.println(sizi);
    			}
    			if(sum==5){
    				count++;
    			}
    		}
    		System.out.println(count);
    		return count;
    	}
    	//所有符号有可能的组合
    	public static int fun_op(int c){
    		if(c==0){
    			for(char o: op){
    				List gen = new ArrayList();
    				gen.add(o);
    				op_list.add(gen);
    			}
    			return 3;
    		}
    		int r = 0;
    		r = r + 3*fun_op(c-1);
    		
    		int k = op_list.size();
    		for(int i=0; i<k; i++){
    			List old = op_list.get(i);
    			List gen1 = new ArrayList(old);
    			gen1.add(op[1]);
    			List gen2 = new ArrayList(old);
    			gen2.add(op[2]);
    			op_list.add(gen1);
    			op_list.add(gen2);
    			old.add(op[0]);
    		}
    		return r;
    	}
    	
    }
    

    转载的解法

    #include<iostream>  
    #include<cstdio>  
    using namespace std;  
    
    int ops[21];  
    const char sym[3] = {'+' , '-' , ' '};  
    int result , num;  
    
    void dfs(int layer, int currentResult, int lastOp, int lastSum)  
    {  
    	lastSum *= (layer > 9) ? 100 : 10;  
    	lastSum += layer;  
    	if(layer == 9)  
    	{  
    		currentResult += (lastOp) ? (-1 * lastSum) : lastSum;  
    		if(currentResult == result)  
    		{  
    			++num;  
    			printf("1");  
    			for(int i = 2 ; i <= 9 ; ++i)  
    			{  
    				if(sym[ops[i-1]] != ' ')  
    					printf(" %c ", sym[ops[i-1]]);  
    				printf("%d", i);  
    			}  
    			printf(" = %d
    " , result);  
    		}  
    		return;  
    	}  
    	ops[layer] = 2;  
    	dfs(layer + 1 , currentResult , lastOp , lastSum);   //Continue  
    	currentResult += (lastOp)? (-1 * lastSum) : lastSum;  
    	ops[layer] = 0;  
    	dfs(layer + 1 , currentResult , 0 , 0);  //Plus  
    	ops[layer] = 1;  
    	dfs(layer + 1 , currentResult , 1 , 0);  //Minus  
    }  
    
    int main(void)  
    {  
    	while(scanf("%d", &result) != EOF)  
    	{  
    		num = 0;  
    		dfs(1 , 0 , 0 , 0);  
    		printf("%d
    " , num);  
    	}  
    	return 0;  
    } 

    这种代码最简单,关键是注意
    currentResult += (lastOp)? (-1 * lastSum) : lastSum;  、

    的位置,这是直接加上或者减去后面一个数。因为不能确定后面一个数是单独的数,还是作为下一个数的前一位,故要将“前一位”这种情况放到这句代码的前面递归,首先解决这种情况。

  • 相关阅读:
    苹果开发者账号多少钱?个人/公司/企业申请费用及怎么选【都有】
    uniapp ios真机调试【亲测有效】
    Uniapp---IOS打包证书私钥密码怎么获取?
    微信小程序地图计算两个点之间的距离
    各大地理坐标系互转
    解决mac下vscode等应用中vim光标无法快速移动
    python 脚本如何在后代运行并记录标准输出
    wkhtmltox 在Linux上安装
    shell中的##*,%%*问题
    matplotlib、seaborn 展示中文字体
  • 原文地址:https://www.cnblogs.com/yan456jie/p/5369531.html
Copyright © 2011-2022 走看看