
HASKELL
可雷曼土
数学是美基础,简单是真理的光辉。
展开
-
haskell 基础题解(61)
最大子组和【题目】已知一个整数数组(可能有正数,也有负数),求它的一个连续的子数组,要求该子数组的和为最大。这样的问题称为最大子组和问题。如果用最普通的解法,考虑所有可能的子数组,分别对其求和,再从这些和中取最大的一个就行了。其时间复杂度为 O(n)。haskell 实现这种想法也很容易:import Data.List (tails,inits)maxSub :: [Int] -&g...原创 2019-09-20 16:38:53 · 398 阅读 · 0 评论 -
haskell 基础题解(46)
身份证号码校验【问题】我们现在使用的身份证号码是18位的。其中最后一位是校验位,它有可能是“X”,代表数字“10”。当某个注册流程让你添身份证号的时候,胡乱凑一些数字是不能通过校验的。原因是这些数字首先需要满足校验规则。其规则是数字公式表示为:∑i=118(ai×Wi)≡1(mod11) \sum_{i=1}^{18} \left ( a_{i} \times W_{i}\right ) \...原创 2019-08-23 13:54:04 · 206 阅读 · 0 评论 -
haskell 基础题解(44)
控制台画圆【题目】用星号在控制上近似地画出一个圆形圆是对称的。只要画出一部分就可以复制了。比如先生成右下角的四分之一圆。取坐标如下图:让 y 的值在 0 到 R 之间均匀变化,算出相应的 x 值x=r2−y2 x = \sqrt {r ^ 2 - y ^ 2} x=r2−y2然后,把这部分镜像变换生成整个圆(拼接的边缘可能要修补一下)。haskell 代码:circleStar...原创 2019-08-22 14:04:09 · 241 阅读 · 0 评论 -
haskell 基础题解(43)
进制转换【问题】我们日常使用的数制是十进制,也就是逢十进一。当然,这种进制只是个偶然(因为我们有十个手指),它本身并没有什么优越的特性,也不具备计算上的便利性。计算机上使用的2进制是最小的一种进制,它的运算简单,硬件上容易实现。不同的进制仅仅是表达形式上的不同,都可以用来表达相同的数值。一般来说,N进制就需要有N个不同的符号。因为0…9 加上A…Z 有36个符号。使用它们,我们可以构造出最多3...原创 2019-08-22 10:54:56 · 220 阅读 · 0 评论 -
haskell 基础题解(30)
小数循环节【问题】我们都会手算除法,比如:123除以13。当然,有的时候会出现无限循环小数。1 请模拟手算除法的过程,计算a除以b的小数后100位。2 发现无限循环小数的循环节,并标识出来。比如:123除以13,表示为:9.[461538]这个题目要求我们模拟手算除法的过程。初看,用命令式的思考更直观,但因为要保存处理计算的过程,也并不占便宜。。。。换用 haskell 呢? 如...原创 2019-08-13 12:00:48 · 281 阅读 · 0 评论 -
haskell 基础题解(29)
祖冲之割圆法【题目】南北朝时,我国数学家祖冲之首先把圆周率值计算到小数点后六位,比欧洲早了1100年!他采用的是称为“割圆法”的算法,实际上已经蕴含着现代微积分的思想。他的方法是从正六边形开始,不断地让边数翻倍,边数越多,多边形边长越接近圆的周长。割圆后,新的边长与原边长的关系,可以用勾股定理给出。如下图:试用此法编程求圆周率。根据前一次的值生成下一个值在 haskell 中可以抽象为...原创 2019-08-12 16:30:40 · 293 阅读 · 0 评论 -
haskell 基础题解(28)
级数法求圆周率【题目】圆周率是个无量纲常数,十分重要。圆周率的求法多种多样。级数法最常见。有些公式看上去很简洁,可惜收敛很慢。如下即是:limn→∞∑k=1n1k2=π26 \lim_{n \to \infty} \sum_{k=1}^n \frac {1}{k^2} = \frac {\pi^2}{6} n→∞limk=1∑nk21=6π2试用此法累加10000项求圆周率。这...原创 2019-08-12 12:55:54 · 401 阅读 · 0 评论 -
haskell 基础题解(42)
Excell地址转换【题目】Excell中,列是用字母来表示的。A表示1, B表示2, … Z 表示26, AA 表示27 …试编写一个程序, 在Excell列地址的字母表达法和十进制表示法间进行转换。Excell 的这个表示法很有趣,它不是标准的26进制表示,因为A并不代表0, 也不是单纯的因为起始从0还从1开始的差1问题。但只要抓住共性即可。高位仍然代表:本位真值⋅26右边第几位−1...原创 2019-08-21 10:50:16 · 245 阅读 · 0 评论 -
haskell 基础理解(41)
罗马数字【题目】古罗马的数字表示体系特点之一是繁难。具说是因为宗教的原因不能在数字中使用“零”的概念。这种体系如今仍有少量使用。比如书籍的目录页,时钟的刻度等。千级以内的表示法是这样的。一些固定的字母代表固定的数字:I(1)V(5)X(10)L(50)C(100)D(500)M(1000)然后,用它们的重复表达更大的数。1,2,3,4… 表示为:I, II, III, IV, V, VI...原创 2019-08-21 09:22:19 · 200 阅读 · 0 评论 -
haskell 基础题解(27)
求解超级方程【题目】 我们可能学过很多方程的解法,但如下这么简单的方程你会解吗?XX=100 X ^ X = 100 XX=100这一点也不奇怪,其实绝大多数的方程都无法解,准确地说是找不到解析解。但有了计算机,对多数方程,我们总可以求出它的模拟解来。模拟解的基本原理很简单,先猜一个数,并想办法判断出这个数是猜大了,还是猜小了。然后修正猜测值,继续猜下去。这个问题与【问题26】手算开平方...原创 2019-08-12 11:53:51 · 272 阅读 · 0 评论 -
haskell 基础题解(26)
手算开平方【题目】如果没有计算机,你会手算开平方吗? 实际上,这不需要特殊的口诀,只要用普通的四则运算就足够了。比如求2的开方,你先猜一个数 p, 用 2 除以 p 得 q。假如正好猜中了,必然 p = q,如果没猜中,那么真实的值必定在 p, q 之间,下一次你就猜 (p+q)/2, 如此反复就可以很快达到很高的精度了。请编程模拟这个过程。从描述中可以感觉到是个递归的过程。haskell 处...原创 2019-08-12 11:08:02 · 255 阅读 · 0 评论 -
haskell 基础题解(40)
通话时长【题目】已知某次通话的开始时间,线束时间,怎样计算通话时长?(假设通话不会超过24小时,但有可能跨午夜)比如: 12:40:15 到 12:41:18 通话 63秒,而23:59:57 到 00:00:01 仅通话了4秒。这个问题与【问题39】有个共同的小窍门:欲求 a, b 的差,可以找一个原点 x,问题变成:a−b=(a−x)−(b−x) a-b= (a-x)-(b-x) a−...原创 2019-08-20 19:18:04 · 285 阅读 · 0 评论 -
haskell 基础题解(37)
最长连续次数【题目】给定一个串,其中可能有的字母连续出现。求最大连续出现的次数。例如:abcddddefgaaaabb,最长连续次数=4,贡献者是 a 和 d这个问题对haskell 而言有点作弊了。因为标准库中的个 group 函数,可以按相同的连续字母进行分组。看代码:import Data.List (group)maxRepeat :: String -> Intmax...原创 2019-08-15 13:20:47 · 224 阅读 · 0 评论 -
haskell 基础题解(36)
补为镜像串【题目】镜像串也叫“回文串”,这种串是首尾对称的,也就是说,正读倒读都一样。给你一个串,至少要添加多少个字母,才能成为镜像串呢?比如: “abb” 需要添一个。“ababcabc” 则需要添3个。(注意,可以任意位置添字母,不局限于首尾)这个问题初看起来没什么头绪,因为哪都能添,太灵活,可能性太多。但如果用递归的思考方法就会另一番景象了。考虑一个镜像串的首尾字母必然是相同的...原创 2019-08-15 12:27:54 · 188 阅读 · 0 评论 -
haskell 基础题解(45)
银行卡号校验【问题】你在自动转帐机器上操作,有没有过这样的担心:万一我把卡号输错了一位,把钱打给了一个陌生人可怎么办呢?银行的人会告诉你,上面会显示对方名字中的一个字,比如,对方叫“张伟”,会显示 **伟,可要是碰巧这个陌生人也叫xx伟呢?其实,完全没有担心的必要,银行卡号如果输错了一位,将会是一个无效的号码,不会对应任何人的帐号。如果输错2位呢?那会有小概率成为他人的帐号(错那么多,你敢说不...原创 2019-08-23 11:31:17 · 235 阅读 · 0 评论 -
haskell基础题解(47)
有理数四则运算【题目】计算机内的浮点数是一种近似表示法。而我们都知道,除法运算产生的小数,要么是有限的,要么就是无限的循环小数。这会因为硬件的制约而导致精度的损失。在一般情况下不是问题,但在有些特殊场合,是不允许有误差的。还好,我们知道,有理数可以表示为整数的比值。如果我们直接存储这个比值,而不是小数,对四则运算将不会的精度的损失。许多的语言都内置了有理数类。请自行设计一个有理数类型,能支持...原创 2019-08-26 11:00:36 · 254 阅读 · 0 评论 -
haskell 基础题解(60)
股票收益【题目】假设你有超能力,能够预知某股票一天中的全部走势数据(每一时刻的成交价格)。请写一个程序,计算你在当天可能获得的最大收益。比如,股价序列是: 5 4 3 4 3 2 1,最大收益为1要小心,可不是最高价卖出减去最低价买入。因为卖出必须在买入之后发生。最大收益的买入与卖出点可能都不是股价的极大值、极小值。这看起来好像只能把所有的买卖点都组合一下就可以。如果是C语言,就两层循...原创 2019-09-17 13:46:39 · 354 阅读 · 0 评论 -
haskell 基础题解(59)
八皇后问题【题目】国际象棋的棋盘是 8 x 8 的格子。皇后的威力最大,她可以横向,竖向,对角线方向攻击任意距离的其它棋子。现在要把8个皇后放在棋盘上,使她们不要互相攻击,有多少种放摆放的方法?分析: 为了不互相攻击,显然每一行必须且只能放一个皇后。并且每一行的皇后在竖直的位置都不能相同。可以用一个数组来表达最后的解,比如:[5,3,6,0,2,4,1,7]就表示,第一行的皇后放在第5格...原创 2019-09-11 13:23:19 · 319 阅读 · 0 评论 -
haskell 基础题解(58)
天平称重【题目】用天平称重时,砝码可以放在左右两个盘中。如果只有1,3,9三个砝码,可以称出13以内的所有整数重量。如果有 1,3,9,27 四个砝码,可以把称重范围扩大到40。如果只提供这种3倍关系的砝码序列。对任意给定的整数重量 x,求称重方案。例如: 19 = 27 - 9 + 1这种问题,如果仔细分析数学规律,当然可以让程序少走弯路。简单的试算就能发现:当数字 n 在 a,b ...原创 2019-09-09 15:33:25 · 177 阅读 · 0 评论 -
haskell 基础题解(57)
整数的划分【题目】把一个正整数N,可以划分为多个数的和的形式。如果规定划分出来的最小数是1,最大数是它本身,则对给定的N,你能列出它的所有划分形式吗?比如:N=4,可以划分为:1+1+1+1, 1+1+2, 1+3, 2+2, 4这类问题是haskell 的强项。问题天然就是一种递归的形式。对于N,如果划出1,则剩下的N-1如何划分?如果划出2, 剩下的要求最小划分数字为2, 怎么划分...原创 2019-09-06 12:28:25 · 263 阅读 · 0 评论 -
haskell 基础题解(56)
控制台月历【题目】给定年份,月份,在控制台输出该月的月历比如,2019年9月的月历:很明显,这个问题的要点是:对给定的年、月,需要知道这个月有多少天,还需要知道它的1号是星期几。可以参考以前关于日期问题的算法。----判断某个年份是否为闰年b闰年 :: Int -> Boolb闰年 year | year `mod` 400 == 0 = True | ...原创 2019-09-05 14:03:27 · 191 阅读 · 0 评论 -
haskell 基础题解(55)
最大公共子串的长度【题目】已知两个串s1 和s2,求它们共同的子串中,最大长度是多少。求的只是最大长度,并不要求找出是哪个子串(或哪些子串),应该比较容易一些。简单递归处理应该行得通,但效率就没准儿了。maxSub :: String -> String -> IntmaxSub [] _ = 0maxSub _ [] = 0maxSub xx@(x:xs) yy@(y:...原创 2019-09-04 20:17:05 · 148 阅读 · 0 评论 -
haskell 基础题解(54)
三阶幻方【题目】把从 1 到 N2N^2N2的整数填入一个N x N 的方阵,如果每行,每列,每个对角线上的数字之和都相等。则称此方阵为幻方。N称为幻方的阶。求所有的三阶幻方(旋转、镜像后相同的视为同一种情况)用1 ~ 9 的数字填九宫格,所有的填法就是 1~9 的全排列。在这个大集合中筛选符合条件的。对最后的结果去掉重复。---- 求所有的三阶幻方import Data.List ...原创 2019-09-03 14:16:36 · 316 阅读 · 0 评论 -
haskell 基础题解(53)
车队入栈问题【题目】编号为 1,2…n 的一个车队,从右向左行驶。道路只能容一辆车通过,无法超车。中间有个死胡同,作为检查站。所有经过车辆必需入站检查。也可能进行很复杂检查,也可能不检查,入站后,马上出站继续上左边的路行驶。检查站容量很大,且也是单车道。求这n辆车最后在左边道路上的排列有多少种可能。很显然,检查站就是一个栈结构,只能在其顶端操作。要么右边的一辆车进入,要么最靠外边的一辆车开...原创 2019-09-02 11:53:15 · 190 阅读 · 0 评论 -
haskell 基础题解(52 最原始加密算法)
原始加密解密【题目】相传最早使用密文传递信息的古罗马军队。他们对明文中字母进行移位处理。比如:A向后移2位,就是C,B就变为D,… 最后,Y变成A,Z变成B收到文件的一方只要向前移动就可以了。当然,为了增加强度,可以一字一密。就是有一个密码本,比如 (2,3,7)。 它表示,遇到第一个字母后移2位,第2个字母后移3位,第3个字母后移7位,第4个字母后移2位,… 如此循环。已知了密码本,请...原创 2019-10-09 15:32:00 · 403 阅读 · 0 评论 -
haskell 基础题解(51)
矩阵乘法【题目】从控制台输入两个整数的矩阵,中间中空行隔开。求这两个矩阵相乘后的矩阵。对 haskell 而言,这个问题的主要工作就是处理好输入输出的格式问题。输入可以先变成行的List, 找到 空行位置分为两部分处理。上代码:import Data.List (transpose)(*.) :: [[Int]] -> [[Int]] -> [[Int]]a *. b ...原创 2019-08-29 12:13:05 · 1063 阅读 · 0 评论 -
haskell 基础题解(50)
点到直线的距离【题目】给定两个点P1,P2,可以唯一地确定一条直线。另给定一点 P0,求P0到直线的距离。已知的是3个点。求的结果是一个浮点数。当 P1= P2 的时候,直线不存在,故无解。其它情况都是有解的。解法一:考虑三角形 P0P1P2 的面积为 S, P1 P2 距离为 d,就可求来 高 h,即为解。三角形面积可用:海伦定理,或三阶生列式。type Point = (Doub...原创 2019-08-28 14:16:24 · 157 阅读 · 0 评论 -
haskell 基础题解(49)
两直线交点【问题】两点确定一条直线。两直线只要不平行,就一定有唯一的交点。请编程,输入两组两点的坐标,求这两条直线的交点坐标。两点(x0,y0) (x1,y1) 所确定的直线形式为 ax + by = c需要用点坐标来确定参数 a, b, c 的值。实际上有效的信息是两个值。因为上面的方程同时放大一定的倍数仍然成立。这样,(a,b,c)是一组解,不是一个。求出任意一个即可。点坐标代入,解...原创 2019-08-27 13:42:07 · 192 阅读 · 0 评论 -
haskell 基础题解(48)
小机器人行走【题目】小机器人站还原点(0,0)位置,头朝北方。建立直角坐标系,x的正方向为东,y的正方向为北。现在给小机人发指令。指令只有3种:“L” 左转90度“R” 右转90度“数字” 表示在当前方向行走x米请编程,对一个指令序列,输出小机器人的最终位置。从haskell 的角度看,当前位置和当前头的朝向就是一个初始状态。从这个初始状态开始,对指令序列进行折叠,得到最终的状态。...原创 2019-08-26 13:39:03 · 180 阅读 · 0 评论 -
haskell 基础题解(35)
汉诺塔【题目】传说印度的一个神庙中,供有天神制成的“汉诺塔”。它是三根柱子。在一根柱子上,从上到下,由小到大叠放着64个金盘。僧人们要把这些金盘搬到另一根柱子上。规则是:一次只能移动一个圆盘。大盘不能叠在小盘的上面。那么,完成这个任务,最少要移动多少次呢?这个问题难点也是大整数运算。大整数的构造见【问题34】。另外还有一个迷惑人的地方:比如要把这些盘子都移到c柱,那第一步是把最小的那个...原创 2019-08-15 11:13:22 · 285 阅读 · 0 评论 -
haskell 基础题解(34)
棋盘放麦子【题目】你一定听过国际象棋的一个有趣的传说。国王为了奖励发明人,答应他在棋盘的第1格放1粒麦子,第2格2粒,第3格4粒,第4格8粒,每格都加倍。求一共放多少粒麦子。(国际象棋的棋盘共有64格)这道题目,主要是考大整数的加法和乘法。对于有些语言,已经内置了大整数,就加点作弊了。haskell就是内置了大整数的支持。----棋盘放麦子total :: Int -> Integ...原创 2019-08-14 20:44:28 · 288 阅读 · 0 评论 -
haskell 基础题解(33)
人民币金额大写【题目】在打印凭据,签定合同等场合,经常需要把人民币金额用汉字大写。这个需求十分常见,十分重要。但细节多,很容易出错。请你把一个整数表示的人民币金额转为金额大写特别要注意,金额中,零的出现,既不能多,也不能少。例如:1000000001 -> 壹拾亿零壹1250030001 -> 壹拾贰亿伍仟零叁万零壹30050 -> 叁万零伍拾总体的大规则上并不难...原创 2019-08-14 17:12:36 · 219 阅读 · 0 评论 -
haskell 基础题解(19)
4位数黑洞【题目】给定一个非0的4位数,重新排列其数位,用最大减最小,得到一个新数,不足4位前补0。重复这一过程,最终会掉入一个黑洞数字。输入一数字,要求输出掉入黑洞的过程数字。对 haskell 不难。直接给出代码,注意可读性,不追求最短。import Data.List (sort)trans :: Int -> Inttrans n | or [n<1,n>9...原创 2019-08-05 14:30:42 · 204 阅读 · 0 评论 -
haskell 基础题解(10)
打印金字塔1【题目】在控制台打印如下的星号组成的金字塔图形这是比较初级的练习题目。解法五花八门。这里给出的 haskell 的解法,注重函数式的思考模式。这种思考习惯真的真的很重要!!!import Data.List (intersperse)xing = [ replicate i '*' | i<-[1,3..] ]kong = [ replicate i ' ' |...原创 2019-08-01 11:02:08 · 254 阅读 · 0 评论 -
haskell 基础题解(18)
角谷定理【题目】给定一个正整数 N, 如果是偶数就折半,如时奇数就 3 * N + 1,如此往复运算,最后一定得到 1。我们把一个数 N 到达 1 用了多少步运算称为它的角谷步长。求 100 以内的数字角谷步长的最大长度。例如,N=7时,它的运算过程:22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1所以,它的角谷步长是17这种折腾序列的问题是 hask...原创 2019-08-05 10:55:38 · 190 阅读 · 0 评论 -
hasell 基础题解(09)
一年中的第几天【题目】给定年月日,求这一天是该年份中的第几天。元旦作为该年的第一天。这个问题相对容易。关键是算出 2 月份有多少天。把每个月的天数放在数组中,然后累加已过去的月份的天数,再加上不足一个月的天数。haskell 代码如下:di_ji :: (Int,Int,Int) -> Intdi_ji (y,m,d) = let run_nian = y `mod` 4...原创 2019-07-31 20:13:01 · 285 阅读 · 0 评论 -
haskell 基础题解(08)
水仙花数【题目】水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身例如: 153 = 1 ^ 3 + 5 ^ 3 + 3 ^ 3求所有的水仙花数。这个题目相对容易。只要一个数一个数测试有没有满足要求就可以了。shui_xian = [ x*100 + y*10 + z | x <- [1..9], y <- [0..9], z...原创 2019-07-31 16:50:29 · 221 阅读 · 0 评论 -
haskell 基础题解(07)
杨辉三角【题目】11 11 2 11 3 3 11 4 6 4 1。。。这个阵势叫杨辉三角,国外叫帕斯卡三角。前一行的数字中,每两个相邻的数字相加就得到下一行的数字。左右两边的数永远是 1写个程序,输出前几行的杨辉三角。给定前一行,生成出下一行,这正是生成器模式(或叫产生器模式),haskell解法:import Data.List (interspe...原创 2019-07-31 16:09:17 · 235 阅读 · 0 评论 -
haskell 基础题解(06)
完全数问题【题目】如果一个数的所有真因子(不包含它自身的因子)之和恰等于其自身,则该数为完全数,也称为完美数(perfect number)。完全数有许多奇妙的性质。但它们很稀少,你来求前几个吧。最小的一个是 6,因为: 6 = 1 + 2 + 3这个完全数的定义已经很清楚了,如果没有什么妙法,就地毯式搜索也可以。下法就是:yin_zi :: Int -> [Int]yin_zi n...原创 2019-07-31 15:10:50 · 226 阅读 · 0 评论 -
haskell 基础题解(05)
分解质因数【题目】给一个数,求它的质因数分解形式例如:10 = 2 * 2 * 5看起来需要一个所有质数的表,从小到大,每一个不断去试除那个给定的数,除开了,它就是一个合格的质因数。。。。。实际上也可以递归地思考,依次从 2,3,4… 中找一个数x去试除N,如果能除开,x收入囊中,然后接着求N/x 的所有质因数就可以了。之所以不用质数列试除也可以,是因为:假如某个合数可除尽,那么它的质数...原创 2019-07-31 14:52:23 · 261 阅读 · 0 评论