用Haskell写的卡普雷尔卡kaprekar黑洞小程序-阿里云开发者社区

开发者社区> 技术小哥哥> 正文

用Haskell写的卡普雷尔卡kaprekar黑洞小程序

简介:
+关注继续查看

无意中在博客园里发现这个卡普雷尔卡黑洞题目,正好适合用haskell练手,就试着用Haskell实现了。 

原题描述:

把一个四位数的四个数字由小至大排列,组成一个新数,又由大至小排列排列组成一个新数,这两个数相减,之后重复这个步骤,只要四位数的四个数字不重复,数字最终便会变成 6174。

例如:

3109,9171 (=9310 - 0139),8532 (=9711 - 1179),6174 (=8532 - 2358),6174 ......

 

复制代码
import Data.Char
import Data.List

nextInt 0 = 6174  -- 当4个数字相同时,会得到0的结果,会使程序出现一个无限序列,所以让0的下一个数为6174
nextInt x = maxInt - minInt
    where list = sort (intToDigits x)  --这种排序是从小到大的
          maxInt = (intFromDigits . reverse) list
          minInt = intFromDigits list

-- 把4个数字的列表转换为整数,例如intFromDigits [1,2,3,4] = 1234 intFromDigits [d1
,d2,d3,d4] = d1*1000 + d2*100 + d3*10 + d4 -- 把一个整数拆分成4个整数,可以有0。例如:intToDigits 1234 = [1,2,3,4]
intToDigits x
= r1:d2:d3:d4:[] -- 这里用了一种模式匹配 where (r3,d4) = x `divMod` 10 -- 1234 `divMod` 10 = (123, 4), r3=123, d4=4 (r2,d3) = r3 `divMod` 10 -- 123 `divMod` 10 = (12, 3), r2=12, d3=3
(r1,d2) = r2 `divMod` 10 -- 12 `divMod` 10 = (1, 2), r1=1, d2=2

-- 生成kaprekar序列, (iterate nextInt x)会生成一个无穷序列,前面用takeWhile把6174后面的数都截断掉
kaprekar x
= (takeWhile (/=6174) (iterate nextInt x)) ++ [6174]

-- 把1到9999的所有4位数都试一遍,只取长度为8的结果
run = [xs | xs<-(map kaprekar [1..9999]), (length xs)==8]
复制代码

 前10个结果是:

[[14,4086,8172,7443,3996,6264,4176,6174],

[15,5085,7992,7173,6354,3087,8352,6174],

[16,6084,8172,7443,3996,6264,4176,6174],

[25,5175,5994,5355,1998,8082,8532,6174],

[41,4086,8172,7443,3996,6264,4176,6174],

[49,9351,8172,7443,3996,6264,4176,6174],

[51,5085,7992,7173,6354,3087,8352,6174],

[52,5175,5994,5355,1998,8082,8532,6174],

[58,8442,5994,5355,1998,8082,8532,6174],

[59,9441,7992,7173,6354,3087,8352,6174]]

本文转自申龙斌的程序人生博客园博文,原文链接:http://www.cnblogs.com/speeding/archive/2013/02/06/2908209.html,如需转载请自行联系原作者

http://www.cnblogs.com/speeding/ 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10056 0
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
26781 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13869 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
9156 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
4653 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
4497 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7359 0
2010
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载