【小学一年级数学】在数字之间填上“+”或“-”号(位置相邻的两个数字可以组成一个数),使等式成立...

本文主要是介绍【小学一年级数学】在数字之间填上“+”或“-”号(位置相邻的两个数字可以组成一个数),使等式成立...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 ☐ 2 ☐ 3 ☐ 4 ☐ 5 ☐ 6 ☐ 7 ☐ 8 ☐ 9 = 100

题目

拿笔试,大概能试出一组解,为了知道究竟有多少组解,我用Haskell解答如下:

先准备一个函数,给定列表,获取所有可能的组合,根据题目要求,可以将相邻两个数字组合成一个数字,如 1, 2, 3 这三个数字列表,将会得到如下几个列表: [[1,2,3],[1,23],[12,3]]

代码:

comb (x:y:xs) = [x:v | v <- comb (y:xs)] ++ [(x*10+y):v | v <- comb xs]
comb (x:xs)   = map (x:) (comb xs)
comb _        = [[]]

不仅仅是加,还有减号,所以准备另外一个函数,将正负号打入:

sign (x:xs) = map (x:) (isign xs) where isign (y:ys) = map (y:) (isign ys) ++ map (-y:) (isign ys)isign _      = [[]]
sign _      = [[]]

验证一下:

main = doprint $ comb [1,2,3]print $ concatMap sign $ comb [1,2,3]

结果:

[[1,2,3],[1,23],[12,3]]
[[1,2,3],[1,2,-3],[1,-2,3],[1,-2,-3],[1,23],[1,-23],[12,3],[12,-3]]

好下面解答就很简单了,直接过滤得到和为100的:

main = doprint $ filter( (==100) . sum )  $ concatMap sign $ comb [1..9]

结果:

[[1,2,3,-4,5,6,78,9],[1,2,34,-5,67,-8,9],[1,23,-4,5,6,78,-9],[1,23,-4,56,7,8,9],[12,3,4,5,-6,-7,89],[12,-3,-4,5,-6,7,89],[12,3,-4,5,67,8,9]
]

共7组解,之前的sign函数有问题,漏掉了连续负号情况,改正后的sign函数将首位提出来不打入负号,尾巴部分由子函数isign挨个打入正负号。

-- 之前的sign函数,刚好漏掉了连续负号情况,所以忽略掉了89的两组解
sign (x:y:xs) = map (\v-> x:v) (sign (y:xs)) ++ map (\v ->x:(-y):v) (sign xs)
sign (x:xs) = map (x:) (sign xs)
sign _ = [[]]

最近在研究Elixir,所以用Elixir也解答了一下,附上Elixir的代码,基本上是参考Haskell直译。


defmodule Num dodef comb(xs) do case xs do[x | [ y | xs]] -> Enum.map(comb([y|xs]), &[x|&1]) ++ Enum.map(comb(xs), &[x*10+y|&1])[h | t]         -> Enum.map(comb(t), fn v -> [h|v] end)_               -> [[]]end enddef sign(xs) docase xs do [h | t]  -> Enum.map(isign(t), &[h|&1])_        -> [[]]endenddefp isign(xs) do case xs do [h | t]  -> Enum.map(isign(t), &[h|&1]) ++ Enum.map(isign(t), &[-h|&1])_        -> [[]]endend
end# test  IEx.configure(inspect: [charlists: :as_lists])
# Enum.map([[1,2], [1,2,3], [1,2,3,4]], &IO.inspect(&1 ++ Num.comb(&1), charlists: :as_lists))
Enum.map([[1,2], [1,2,3], [1,2,3,4]], &IO.puts("#{inspect(&1, charlists: :as_lists)} : #{inspect(Num.comb(&1), charlists: :as_lists)}"))
IO.puts "[1,2,3] to comb & sign: "
IO.inspect(Enum.flat_map(Num.comb([1,2,3]), &Num.sign(&1)), charlists: :as_lists)
# result 
IO.puts "\nResult Of: 1 ☐ 2 ☐ 3 ☐ 4 ☐ 5 ☐ 6 ☐ 7 ☐ 8 ☐ 9 = 100"
#IO.inspect(Enum.filter(Enum.flat_map(Num.comb(Enum.to_list(1..9)), &Num.sign(&1)), fn x -> 100 == Enum.sum(x) end), charlists: :as_lists)
1..9 |> Enum.to_list |> Num.comb |> Enum.flat_map(&Num.sign(&1)) |> Enum.filter(&Enum.sum(&1)==100) |> IO.inspect(charlists: :as_lists)

输出结果:

[1, 2] : [[1, 2], [12]]
[1, 2, 3] : [[1, 2, 3], [1, 23], [12, 3]]
[1, 2, 3, 4] : [[1, 2, 3, 4], [1, 2, 34], [1, 23, 4], [12, 3, 4], [12, 34]]
[1,2,3] to comb & sign: 
[[1, 2, 3],[1, 2, -3],[1, -2, 3],[1, -2, -3],[1, 23],[1, -23],[12, 3],[12, -3]
]Result Of: 1 ☐ 2 ☐ 3 ☐ 4 ☐ 5 ☐ 6 ☐ 7 ☐ 8 ☐ 9 = 100
[[1, 2, 3, -4, 5, 6, 78, 9],[1, 2, 34, -5, 67, -8, 9],[1, 23, -4, 5, 6, 78, -9],[1, 23, -4, 56, 7, 8, 9],[12, 3, 4, 5, -6, -7, 89],[12, -3, -4, 5, -6, 7, 89],[12, 3, -4, 5, 67, 8, 9]
]

转载于:https://my.oschina.net/jsk/blog/3071777

这篇关于【小学一年级数学】在数字之间填上“+”或“-”号(位置相邻的两个数字可以组成一个数),使等式成立...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/227730

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

基于Python实现数字限制在指定范围内的五种方式

《基于Python实现数字限制在指定范围内的五种方式》在编程中,数字范围限制是常见需求,无论是游戏开发中的角色属性值、金融计算中的利率调整,还是传感器数据处理中的异常值过滤,都需要将数字控制在合理范围... 目录引言一、基础条件判断法二、数学运算巧解法三、装饰器模式法四、自定义类封装法五、NumPy数组处理

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat