最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,看来想准确理解MOVE的机制,还需要对Rust有深刻的理解,所以开始了Rust的快速入门学习。
看了一下网上有关Rust的介绍,都说它的学习曲线相当陡峭,曾一度被其吓着,后来发现Rust借鉴了Haskell等函数式编程语言的优点,而我以前专门学习过Haskell,经过一段时间的入门学习,我现在已经喜欢上这门神奇的语言。
入门资料我用官方的《The Rust Programming Language》,非常权威,配合着《Rust by example》这本书一起学习,效果非常不错。
学习任何一项技能最怕没有反馈,尤其是学英语、学编程的时候,一定要“用”,学习编程时有一个非常有用的网站,它就是“欧拉计划”,网址: https://projecteuler.net
中文版的翻译: http://pe-cn.github.io
这个网站提供了几百道由易到难的数学问题,你可以用任何办法去解决它,当然主要还得靠编程,但编程语言不限,已经有Java、C#、Python、Lisp、Haskell等各种解法,当然直接用google搜索答案就没意思了。
学习Rust最好先把基本的语法和特性看过一遍,然后就可以动手解题了,解题的过程就是学习、试错、再学习、掌握和巩固的过程,学习进度会大大加快。
我把63道题分为几大类,通过研究这些题的解法,我学会了Rust的一些语法知识点和编程算法。
这一部分题型相对简单,可以了解Rust的基本数据类型,整数运算、文件读取和字符串操作。
- 第1题 筛选整数
- 第2题 偶斐波那契数
- 第3题 最大质因数
- 第4题 最大回文乘积
- 第5题 最小倍数
- 第6题 平方和与和的平方之差
- 第8题 连续数字最大乘积
- 第17题 表达数字的英文字母计数
- 第22题 姓名得分
主要的语法知识点:
- Rust的安装
- cargo包管理器的使用
- vscode中相关插件的安装,程序的调试
- println!宏的使用
- 循环语句for的写法,注意与C语言的不同之处
- mut关键字,体会什么是可修改的变量
- 向量Vec的基本用法,vec!宏的使用
- 迭代器iter()和enumerate()的基本用法
- 延迟评价的设计理念
- 强类型特点,几种数据类型
- 字符串的基本操作,字符串切片slice的理解
- 字符与整型的转换
根据一定的规则,一个数字可以变换为另一个数字,但最后会收敛到一个特定的值。
- 第14题 最长考拉兹序列
- 第92题 平方数字链
主要的语法知识点:
- 递归函数的写法
- chars()、map()、sum()和count()等函数的应用
- 如何优化程序的性能
- if表达式
一个数有质因子,真因子等概念,然后引出了亲和数、盈数等有趣的数字。
- 第12题 因子繁多的三角数
- 第21题 亲和数
- 第23题 非盈数之和
- 第47题 不同的质因数
主要的语法知识点:
- 因子、质因子的求法
- 数组作为函数参数的写法:&[bool]
- primes函数库的使用
欧拉是一个数学家,所以欧拉计划中题型以数学题为主,而其中与素数有关的问题特别多。
- 第7题 第10001个素数
- 第10题 素数的和
- 第27题 二次多项式生成素数
- 第35题 旋转素数
- 第37题 左截和右截素数
- 第50题 连续素数的和
- 第58题 螺旋素数
- 第97题 非梅森大素数
主要的语法或算法:
- 筛子求素数的算法
- const常量定义的写法
- usize和isize的应用
- 字符串的push()、remove()和parse()函数的应用
- filter()和take()的使用
勾股数、幂运算、阶乘、回文等一些数字游戏。
- 第9题 特殊勾股数
- 第11题 方阵中的最大乘积
- 第28题 螺旋数阵对角线
- 第30题 各位数字的五次幂
- 第32题 全数字的乘积
- 第34题 各位数字的阶乘
- 第36题 两种进制的回文数
- 第38题 全数字的倍数
- 第40题 钱珀瑙恩常数
- 第46题 哥德巴赫的另一个猜想
- 第52题 重排的倍数
- 第206题 被遮挡的平方数
主要的语法知识点:
- 二维数组的写法
- 步长大于1的迭代器用step_by()
- chars()和map()的组合运用
- 数字的二进制转换
各种编程语言通常都提供64位的整数,表示的最大值为18446744073709551615,也只有20位数字。对于超过这个范围的整数,平常的数据类型就无法进行运算,这时需要用到大整数函数库num-bigint。
- 第13题 大整数求和
- 第16题 幂的数字和
- 第20题 阶乘数字和
- 第25题 一千位斐波那契数
- 第29题 不同的幂
- 第48题 自幂
- 第53题 组合数选择
- 第55题 利克瑞尔数
- 第56题 幂的数字和
- 第57题 平方根逼近
- 第63题 幂次与位数
主要的语法知识点:
- 字符串转换成BigUInt
- 切片slice的使用
- fold()函数的学习
求不同的路径或者最大路径,学习递归算法和改进算法。
- 第15题 网格路径
- 第18题 最大路径和I
- 第67题 最大路径和II
主要的语法和算法:
- 把一个可修改的向量当作函数参数的写法,&mut Vec
- 递归中缓存一些运算结果
- 读文件的操作
- 路径中分层计算的算法优化
只有一道涉及日期的计算。
- 第19题 数星期日
主要的语法知识点:
- chrono函数库的使用
- day()和weekday()的使用
- 表示时间跨度的time::Duration
学习全排列的几种生成算法。
- 第24题 字典序排列
- 第31题 硬币求和
- 第41题 全数字的素数
- 第49题 素数重排
- 第43题 子串的可整除性
主要的语法和算法:
- 学写按字典生成全排列的算法
- 不重新发明轮子,使用别人的库 permutohedron::heap_recursive
分数可以表示为无限循环小数,不断试除和取余来找循环节。
- 第26题 倒数的循环节
- 第33题 消去数字的分数
主要的语法知识点:
- Option、Some和None的使用
- match关键字如何匹配表达式
根据一个函数可以生成一系列的整数。
- 第39题 直角三角形
- 第42题 编码三角形数
- 第44题 五边形数
- 第45题 三角形数、五边形数和六角形数
主要的语法或算法:
- 字符与ASCII码的转换
- 一元二次函数的求根公式
这里有两道初级的黑客问题。
- 第59题 异或解密
- 第79题 密码推断
主要的语法知识点:
- 异或XOR
- 字符串的split()函数的使用
- graphviz工具的运用
可以在projecteuler中添加下面这个key,加我为好友,一起学习。
1539870_KBNiIXymh4SnmDEDZmUTg7tu1MTBVlLj
欧拉计划的官网不让在外面发布与欧拉计划解题有关的内容,如果超过100道则封账号,此github已经解决了80多道题,以后可能不会更新了。
我把解题的过程记录了下来,写成了一本《用欧拉计划学 Rust 编程》PDF电子书,请随意下载。
链接:https://pan.baidu.com/s/1NRfTwAcUFH-QS8jMwo6pqw
提取码:qfha
将来只会自己更新这个PDF了,不再发布在互联网上。如果谁有需要,加我的微信(SLOFSLB)获取,暗号:欧拉计划。