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

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

等式变换java解法的更多相关文章

  1. Java解法-两数相加(Add Two Numbers)

    问题  给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. ...

  2. P1149_火柴棒等式(JAVA语言)

    题目描述 给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-90−9的拼法如图所示 ...

  3. 揭秘人脸对齐之3D变换-Java版(文末赋开源地址)

    一.人脸对齐基本概念 人脸对齐通过人脸关键点检测得到人脸的关键点坐标,然后根据人脸的关键点坐标调整人脸的角度,使人脸对齐,由于输入图像的尺寸是大小不一的,人脸区域大小也不相同,角度不一样,所以要通过坐 ...

  4. 人脸识别中的重要环节-对齐之3D变换-Java版(文末附开源地址)

    一.人脸对齐基本概念 人脸对齐通过人脸关键点检测得到人脸的关键点坐标,然后根据人脸的关键点坐标调整人脸的角度,使人脸对齐,由于输入图像的尺寸是大小不一的,人脸区域大小也不相同,角度不一样,所以要通过坐 ...

  5. Hanoi问题java解法

    用什么语言解法都差不多,思路都是一样,递归,这其中只要注重于开始和结果的状态就可以了,对于中间过程,并不需要深究.(我细细思考了一下,还是算了.=_=) 代码其实很简单注重的是思路. 问题描述:有一个 ...

  6. ✡ leetcode 161. One Edit Distance 判断两个字符串是否是一步变换 --------- java

    Given two strings S and T, determine if they are both one edit distance apart. 给定两个字符串,判断他们是否是一步变换得到 ...

  7. 杭电oj 4004---The Frog Games java解法

    import java.util.Arrays; import java.util.Scanner; //杭电oj 4004 //解题思路:利用二分法查找,即先选取跳跃距离的区间,从最大到最小, // ...

  8. 10元买啤酒问题Java解法

    10元去买啤酒,2元一瓶.每两个瓶可以换一瓶啤酒,每四个瓶盖可以换一瓶啤酒.最多买几瓶? public class Java { public static void main(String[] ar ...

  9. LeetCode--006--Z字型变换(java)

    将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T ...

随机推荐

  1. 1.什么是bat文件

    bat文件是dos下的批处理文件.批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd. 在命令提示下输入批处理文件的名称,或者双击该批处理文件,系统就会调用c ...

  2. idea逆向生成hibernate工程

    1.创建maven工程 2.在resources下创建hibernate.cfg.xml文件 <?xml version='1.0' encoding='utf-8'?> <!DOC ...

  3. (转)Linux传输大文件(分割传输)

    1.分拆为多个文件的命令: cat workspace_2018.tar.gz | split -b 1G - workspace_2018.tar.gz. 命令解释: workspace_2018. ...

  4. 【bzoj 4059】Non-boring sequences

    这题的重点不在于代码,而在于复杂度分析…… 首先我们肯定会写 $n^2$ 暴力,就是每次暴力扫 $[l,r]$ 区间,找到任意一个在此区间中只出现过一次的数.设其下标为 $mid$,显然在这个区间中任 ...

  5. 谨慎使用mysql的replace into(转载)

    MySQL 对 SQL 有很多扩展,有些用起来很方便,但有一些被误用之后会有性能问题,还会有一些意料之外的副作用,比如 REPLACE INTO. MySQL 在数据冲突时实际上是删掉了旧记录,再写入 ...

  6. C++使用socket传输图片

    Client: #include <WinSock2.h> #include <Windows.h> #include <stdio.h> #pragma comm ...

  7. 【CF160E】Buses and People

    题目大意:给定 N 个三元组 (a,b,c),现有 M 个询问,每个询问给定一个三元组 (a',b',c'),求满足 a<a', b'<b, c'<c 的最小 c 对应的元组编号. ...

  8. 解决Iview 中 input 无法监听 enter 事件

    比如 我们想要在某个组件的根元素监听一个原生事件 可以使用 .native 修饰 v-on 例子: 这样子写 enter事件将无效 但是使用 .native 修饰 就可以监听到 enter事件啦.

  9. nodejs之express入门

    首先安装nodejs,官网下载安装包直接安装, 由于node自带npm,所以npm命令直接即可使用 打开cmd,使用npm install -g express-generator安装express ...

  10. Spring Controller RequestMapping

    不同的Controller,可以标记相同的RequestMapping 但是精确到函数上时,不可以标记相同的RequestMapping构成完成相同的请求路径,如果标记,运行会报错,提示有相同的路径, ...