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

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

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

相关文章

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

java字符串数字补齐位数详解

《java字符串数字补齐位数详解》:本文主要介绍java字符串数字补齐位数,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java字符串数字补齐位数一、使用String.format()方法二、Apache Commons Lang库方法三、Java 11+的St

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机