python求出五位数的回文数_寻找山峯数以及作为拐杖的编程

编者按:前几天在Do Math社群分享了一个关于数字的小问题,如下: mountain number 高山数,指一个数,从1开始,后续数字逐渐变大,最后落回1;如12461;请问这样的三位数有多少?四位数有多少?这样的数是有限的吗? 群友们一般都能算出三位数、四位数的答案,也能推断出“这样的数是有限的”,但到底有多少个高山数呢?或者先问,有多少个五位数高山数呢?这样一问,问题就复杂了许多。但这就是数学,我们要不断地追问,直到把一个问题搞透彻。群友米青色蚱蜢刚好在学编程,就用编程算出了五位数的高山数。过程很精彩,本文就是他的思考过程梳理。

01

山峯数的定义

姚老师给出的定义是这样的:

mountain number 高山数,指一个数,从1开始,后续数字逐渐变大,最后落回1;如12461;请问这样的三位数有多少?四位数有多少?这样的数是有限的吗?

cc1527a11ea4ce7b141dfb8201da5042.png

意大利 维索山

初看定义,我感受到的是初中学物理时面对各种物理概念的一脸懵逼以及头脑中的一团漿糊。

额,山峯数的定义到底是什么呢?

我打开了谷歌,汉字"高山数"(此处采用姚老师的翻译)基本没结果,輸入"mountain number",得到了一个至关重要的结果。

在oeis.org上我得到了一个山峯数的清晰定义:

"For n>1 the structure of digits represent a mountain. The first digit is 1. The last digit is 1. The first digits are in increasing order. The last digits are in decreasing order. The numbers only have one largest digit. This sequence is finite. The last member is 12345678987654321.

- Hans Havermann, Nov 25 2007"

我整理成列表是这样的。

  1. 第一个数字是1 

  2. 最后一个数字是1

  3. 前半部分是依次递增

  4. 后半部分是依次递减

  5. 有且只有一个最大数字

    根据定义:高山数是有限的,最大的高山数为:12345678987654321

附:

Mountain number,我的翻译是山峯数,理由如下:

《說文•山部》:“峰,山耑也。”这里说的就是山顶。而mountain number根据定义,只有一个顶点,把其可视化,就是一个三角形嘛。

在登山上,要怎么知道一座山比另一座山更重要?哪一座山更难以征服?用的也是山峯突起度的概念,直观地看就是峯形。很高的山也可能就是高原上的一个大土坡啊。

02

初次解答

我没有就此止步,这是一个DoMath的数学训练营嘛。

我想知道,如果有限那么总数是多少?而且我也想亲自动手把它们算出来。

如何做,一开始我也没有思路,那就使劲想吧。

一番艰苦的努力后,我得出了这样的答案,思路是直接用排列算法。

938b1238a7ab32ed4db469e46119bd59.png 00f6e485208a83635cf78de9ffddb9e7.png bf0fead56e692012077273226c665697.png

坦白说,到底什么是排列,我也不是很明白,我也没有真能就8X7的排列,把它们的所有可能一一列出来。

姚老师指出了我的五位数算法有误,"13241"这样的就不算山峯数啊。

确实,但如果按他的建议一个个列举,虽然可行,但我觉得麻烦,我不想这么做。

如果事情到这里,下面的事情也就不会發生了。

03

契机,笨拙的尝试

契机出现在一个群友对我的询问,问我五位数的山峯数是不是111?她也说自己没想太明白。

嗯,我其实也不太明白。

因为下面这张图和依我对山峯数的了解,觉得好玩,我就决定继续探索一番了。

4919c62c09d797cc184e6805fd0fb77e.png

但这次我想用编程的方式,电脑计算起来可比人快多了。

我只要提供一个计算机可以执行的解题思路,然后,利用我的信息搜索能力找出需要使用的编程函数和一些可参考的具体实例不就行了。

我的想法就是这样,然后就信心滿滿,兴冲冲地去做了。

具体的过程是曲折的,也有卡脑壳的时候。

我好久没接触过编程了,而且也就只有一丟丟的基础。

我的能力也就仅限于照葫芦画䕯,但我没管那么多,DoMath就是要做嘛,即使有现成的方法,我也先拿过来自己运行一遍。

好在,没有现成的代码,所以我选定了python后,就测试运行修改再运行,从小到大,从简单到复杂,连for和if语句的用法都是又重新学习了一下。而且也把排列组合的概念也看了看。

40976a32acbb620987ff0ac47b91f76c.png

跌跌撞撞,我走在正确的方向上,最终先把五位数的山峯数搞定了。

9c614290978049a843ec833dabe1ab7c.png

不足之处是,1ABC1中A=C的这样的情况需要我手算,还好,好算。

确定过程正确过程无误后,發给姚老师,他说很赞,可以發到群里。

晚上在吃汉堡等人的空档,把解题思路梳理了一下,就连同代码和结果一起發到群里了。

用python列出高山数的1ABC1数列

一些說明:

因为不想一个个地用手列举,就想到了计算机的办法。我有一点点的编程基础,但直接让我坐下来写出来这道题的程序,那是不可能的。但,我有思路,于是就按我的思路寻找相应的解决工具及具体案例。几经尝試,几番試錯,基本解决了。小問題是:1aba1这种情況的数列我还没想到解決办法,只能手算,共有28种。加上其它的224,五位数的高山数有252个。

解題思路:

1,穷举数列

Python的permatutions函數(初版使用)

range函數(改进版)

2,比较大小

For循環和if語句及elif语句

3,輸出结果

Linux command line

4,统计数目

Linux命令:cat -n

改进版的参考鏈接:函數性能,列出四个不重复数字(0-9)的所有组合https://groups.google.com/forum/#!topic/python-cn/TZ7ajkIqbPg

群友在第二天的上午也發出了自己手算得出的结果,能看到他/她的欣喜和成就之感。

08583d3d4d19374a6182267f4a6684e3.png

我在吃汉堡的那天晚上回家路上也得到了新的灵感,连夜重写了计算代码,用的是range函数,这下可以一次性把五位的山峯数的所有结果都导出了。这次就快多了,一个多小時就搞定了,问题出在elif的用法上,python老是提示我indentation error,原来elif语句要对齐,学习了。

aaf7ebcdca549d964781e6c74edd3753.png

04

尾声

寻找山峯数的旅程暂告一段落了,后续我想尝试用一整段代码一次性列出所有的山峯数。

但就此次旅程而言,我无意間走出了一条通向真实学习的路径。

山峯数对我不再是个空洞的概念,数学的魅力也直接向我作了呈现。

不再只是一堆数字,它们果然是凝固了的思维的激情,不过要靠着一番脑力的探索才能得到。

不是仅存于书本上、抽象中,而是在山峯中、在社群中、在与他人的交互中,也有它们的身影。

这可能只需要你迈出小小的一步,从抽象的虚幻走向现实的呈现。

然后回望与回味,这数学的纯粹与甘甜。

这是DoMath给我帯来的一份小礼物啊。

文末赞赏,鼓励Domath社员。 活动推荐: 【E.T.工程夏令营】8.2-8.10日,详情请点?

038559069b9564731000ed5dfe931e50.png

【Do math 数学社群】7.11-8.29日,详情请点?

a6bf623cef53b8c11471c42ab50992f7.png

姚工镐铧,为数学辩白,勤耕细作。 e40527a461818b118f0a8aaa764fec8d.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值