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

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

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

相关文章

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言