等式成立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 = new ArrayList<>();

private static List> 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

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

List l = op_list.get(i);

int sum = 0;

for(int j=0; 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

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

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 = new ArrayList<>();

private static 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

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

//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

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

#include

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\n" , 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\n" , num);

}

return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值