等式变换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\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解法的更多相关文章
- Java解法-两数相加(Add Two Numbers)
问题 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. ...
- P1149_火柴棒等式(JAVA语言)
题目描述 给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-90−9的拼法如图所示 ...
- 揭秘人脸对齐之3D变换-Java版(文末赋开源地址)
一.人脸对齐基本概念 人脸对齐通过人脸关键点检测得到人脸的关键点坐标,然后根据人脸的关键点坐标调整人脸的角度,使人脸对齐,由于输入图像的尺寸是大小不一的,人脸区域大小也不相同,角度不一样,所以要通过坐 ...
- 人脸识别中的重要环节-对齐之3D变换-Java版(文末附开源地址)
一.人脸对齐基本概念 人脸对齐通过人脸关键点检测得到人脸的关键点坐标,然后根据人脸的关键点坐标调整人脸的角度,使人脸对齐,由于输入图像的尺寸是大小不一的,人脸区域大小也不相同,角度不一样,所以要通过坐 ...
- Hanoi问题java解法
用什么语言解法都差不多,思路都是一样,递归,这其中只要注重于开始和结果的状态就可以了,对于中间过程,并不需要深究.(我细细思考了一下,还是算了.=_=) 代码其实很简单注重的是思路. 问题描述:有一个 ...
- ✡ leetcode 161. One Edit Distance 判断两个字符串是否是一步变换 --------- java
Given two strings S and T, determine if they are both one edit distance apart. 给定两个字符串,判断他们是否是一步变换得到 ...
- 杭电oj 4004---The Frog Games java解法
import java.util.Arrays; import java.util.Scanner; //杭电oj 4004 //解题思路:利用二分法查找,即先选取跳跃距离的区间,从最大到最小, // ...
- 10元买啤酒问题Java解法
10元去买啤酒,2元一瓶.每两个瓶可以换一瓶啤酒,每四个瓶盖可以换一瓶啤酒.最多买几瓶? public class Java { public static void main(String[] ar ...
- LeetCode--006--Z字型变换(java)
将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T ...
随机推荐
- selenium入门学习
在写爬虫的学习过程中,经常会有一些动态加载,有些是可以动过接口直接获取到,但是实在没办法,所以学习下selenium. 首先百度一下: Selenium [1] 是一个用于Web应用程序测试的工具. ...
- 全年DDoS攻击分析|知道创宇云安全2018年度网络安全态势报告
*本报告由知道创宇云安全出品* 数据来源:知道创宇云防御平台 前言 2018年,网络安全领域暗流涌动,攻击趋势不断攀升,T级DDoS攻击多次爆发.数据泄露事件层出不穷.勒索软件大行其道.此外,随着我国 ...
- Java缓存要点
1.缓存一般是这样的:先查缓存,查不到就查DB,如果DB查不到就结束,DB查到了就写入缓存. 如果用户一直在大量地查询不存在的数据,则所有的请求都会落到DB,而且没有数据写入缓存. 解决方法:把查不到 ...
- Delphi Button组件
- python、mysql四-2:多表查询
一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备表 #建表 create table department( id int, name varchar() ); create tabl ...
- gitlab和jenkins的安装及使用
gitlab 准备: 最少4G内存 先安装docker软件包然后使用docker search gitlab 查找镜像然后使用docker pull 镜像名:标签名 下载镜像启动容器: docker ...
- 02-jar包操作---引用本地包--maven项目
在idea工具中,普通项目的话,直接在jar上右键add as library就行了. 如果是maven项目 可以将包,放入lib目录下,然后在pom文件配置引用.例子: <!--引入非本地仓库 ...
- java8学习之Collector复合与注意事项
接着上一次[http://www.cnblogs.com/webor2006/p/8318066.html]继续对Collector进行javadoc详读,上一次读到了这: 接下来一条条来过目一下: ...
- java7连接数据库 网页 添加学生信息测试
石家庄铁道大学2019年秋季 2018 级课堂测试试卷(六)(10分) 课程名称: JAVA语言程序设计 任课教师: 王建民 考试时间: 150 分钟 一. 考试要求: 1登录账号 ...
- ES数据架构与关系数据库Mysql
ES数据架构的主要概念(与关系数据库Mysql对比) MySQL ElasticSearch Database Index Table Type Row Document Column Field S ...