刷完欧拉计划中难度系数为5%的所有63道题,我学会了rust中的哪些知识点?

speeding speeding     2023-05-07     638

关键词:

我为什么学Rust?

2019年6月18日,Facebook发布了数字货币Libra的技术白皮书,我也第一时间体验了一下它的智能合约编程语言MOVE,发现这个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最好先把基本的语法和特性看过一遍,然后就可以动手解题了,解题的过程就是学习、试错、再学习、掌握和巩固的过程,学习进度会大大加快。

题型介绍

欧拉计划中的各题都标出了难度系数,以百分数来表示,5%是其中难度最低的,难度最高的为100%,截止到2019年10月10日,难题系数为5%的题共有63道,可以作为Rust的入门练手题。

这些初级难度的题目,主要涉及整除性质、素数、因子、分数、回文数、阶乘、三角数、大整数、数字序列、路径计算、日期、全排列、组合数、初级密码学等方面,通过解这些题,可以了解Rust中的基本数据类型,向量用法,理解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工具的运用

小结

1、刷题容易上瘾

一开始解题是想快速掌握Rust的语法,前面进展较慢,因为语法不熟,需要边看Rust编程书,边google,边试验才能解决一道题。

在完成了30题左右之后,有点游戏闯关上瘾的感觉,有点题即使5%难度系数,解决起来也并不容易,需要不断找bug或优化算法的性能,当在projecteuler.net上输入答案得到正确反馈的一刻,有一种成功的喜悦。

然后就想会把前50题,前70题全部攻克!

然后就会忘了学Rust的初心,忘了做欧拉题的初心,我是想学MOVE编程语言,我是想学区块链的智能合约编程技术,所以就放慢了刷题的节奏。

写完这63道题的小结,也是将前面学习Rust的过程进行一次小结。后面可能会更新这本PDF书,也可能不会。

2、数学题并不是全部

欧拉计划以数学题为主,对数学或算法感兴趣的朋友,可以拿它练习,如果你学习JAVA、C#、Python等编程语言,拿它练练手,绝对挺有用。

但它的局限性也是显然的,实际的软件项目中几乎很难遇到素数判断、质因子、大整数以及全排列生成的这些算法。你更要学习模块的划分、单元测试的编写、程序的调试的基本技巧,字符串操作、数组排序、字典、哈希表的运用可能更加频繁。

3、函数式编程

现代的编程语言都结合了过程式编程和函数式编程的优点,通过这些例子的练习,你既可以知道通常的过程式算法的写法,也要理解函数式编程的优美和简洁,但在实际项目中又不能为了函数式编程减少几行代码而去刻意地炫技,让程序失去了可维护性。

需要在过程式编程和函数式编程之间达到一种平衡。

4、还得结合其它编程书籍

程序完成了,得到了正确的答案,事情并没有结束,Rust背后的一些原理,仍需要深入地理解,字符串和切片的区别,iter()的背后机制,如果定义宏,所有权的借用关系,这些都还没有掌握。


内容太多,我直接把它写成了一本电子书,下载地址:

链接: https://pan.baidu.com/s/1Py8rp4pqAQ5EU7vz6uLYxQ

提取码: 58zw

java区块链中设计合理的难度系数

难度系数的概念区块链的难度系数:是设计区块链挖矿难易的关键因子,难度系数越低,挖矿越容易。难度系数越高,相应越难。例如比特币的难度系数是18。难度系数一般是hash值的前置0的个数。java区块链中设计合理的难度系... 查看详情

uoj117:欧拉回路——题解

http://uoj.ac/problem/117(作为一道欧拉回路的板子题,他成功的令我学会了欧拉回路)(然而我不会背……)就两件事:1.无向图为欧拉图,当且仅当为连通图且所有顶点的度为偶数。2.有向图为欧拉图,当且仅当其基图(将有向边变... 查看详情

uva_10653公主与王子#刘汝佳dp题刷完计划

题意如蓝书66页例题27所示。这个问题描述了一个LCS的特殊情况——单个字符串内所有元素各不相同。题目要求输入两个数字串,A,B,要求求出最长公共字串。且数字上限是256*256。做法:数组A表示为256*256的大数组,每一位表示... 查看详情

我梦想中的学习组织-勤学会

...、加入后的福利明星级大佬助学团有问必答训练营/学习计划共读计划专属的「C++」计划三、如何加入粉丝福利零:勤学会是什么CSDN重磅推出了“勤学会”,由CSDN官方组织的,为CSDN学习会员提供的专属学习氛围... 查看详情

我梦想中的学习组织-勤学会

...、加入后的福利明星级大佬助学团有问必答训练营/学习计划共读计划专属的「C++」计划三、如何加入粉丝福利零:勤学会是什么CSDN重磅推出了“勤学会”,由CSDN官方组织的,为CSDN学习会员提供的专属学习氛围... 查看详情

剑指offer63:数据流中的中位数

...位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。本题最开始简单的理解为求中位数,使用的... 查看详情

codevs——2841愤怒的ljf(背包)

...,他很愤怒。他挤出T时间做题,他有Q的智慧,他只会做难度系数比他的智慧低或相等的题目。有N道题,第i道题的时间为Ti,难度系数为Qi,可获积分Wi。LJF有M积分,ZPC有S积分,求L 查看详情

欧拉计划第10题题解(代码片段)

SummationofprimesThesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion.素数的和所有小于10的素数的和是2+3+5+7=17。求所有小于两百万的素数的和。解题思路没有特别好的想法,下奶能想到的就是枚举算出200万以内的所有素数,... 查看详情

38天刷完挑战程序设计竞赛&数论概论计划

...翻了一下挑战程序设计竞赛,感觉相见恨晚;遂决定38天刷完挑战程序设计竞赛和数论概论。时间:2017年12月7日00:00:00--2018年1月15日00:00:00目前进度:数论概论完成前6章,挑战程序设计竞赛完成0目标:刷完数论概论44章,理解所... 查看详情

hdu1878欧拉回路+并查集

 无向图欧拉回路的判定:图连通;图中所有节点度均为偶数有向图欧拉回路的判定:图连通;所有节点入度等于出度 这道题属于无向图,首先用并查集判断图的联通性,各点的度数用一个数组保存下来。如果一个点的根结... 查看详情

找到字符串中所有字母异位词

LeetCode75学习计划适用于想为技术面试做准备但不确定应该聚焦于哪些题目的用户。学习计划中的题目都是经过精心挑选的,Level1和Level2学习计划是为初级用户和中级用户准备的,题目覆盖了大多数中层公司面试时所必需的数据... 查看详情

poj2513(代码片段)

...棒的公共交点颜色相同)将题意抽象化,可以发现这是个欧拉回路的板子。将所有的木棒看做一条边,颜色看成点。要满足要求,就要使得到的图有欧拉回路(显然)。而且这里不需要输出方案,所以就更加水了,直接记录每个... 查看详情

欧拉计划 #29

】欧拉计划#29【英文标题】:PROJECTEULER#29【发布时间】:2010-01-2714:41:16【问题描述】:好吧,在用天真的STL集解决了这个problem之后,我正在阅读论坛条目,在那里我找到了这个条目:#include<iostream>#include<cmath>#defineMAX100u... 查看详情

二叉树中是否存在节点和为指定值的路径(nc9/考察次数top63/难度简单)(代码片段)

描述:给定一个二叉树和一个值sum,判断是否有从根节点到叶子节点的节点值之和等于sum的路径,例如:给出如下的二叉树,sum=22,返回true,因为存在一条路径5→4→11→2的节点值之和为22。示例1输... 查看详情

一道区间dp和一道字符串

...中我=-= 第一道:小Q同学为了准备今年的ICPCRegional,计划在天之内刷掉道题,每道题有一个难度值,其中第道题的难度值为。然而处于半颓废状态中的小Q同学不希望在同一天中做难度差距悬殊的题目,定义第天中刷的题的难... 查看详情

nyoj63小猴子下落

...下落时间限制:3000 ms | 内存限制:65535 KB难度:3 描述有一颗二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3,·····,2的D次方减1。在结点1处... 查看详情

63天算法训练详细说明

...概是1年3个月,当然某些时候状态好或者时间充足一口气刷完好几天的量也不奇怪,因此Day1对应的题目编号为1-3,Day2对应的为4-6...Day419对应的为1255-1257。冰冻三尺非一日之寒,这里给自己开个坑,慢慢把它填完。官方网站有更... 查看详情

用欧拉计划学rust编程(第61题)(代码片段)

...。我把解决63道问题的过程记录了下来,写成了一本《用欧拉计划学Rust编程》PDF电子书,请随意下载。链接:https://pan.baidu.com/s/1NRfTwAcUFH-QS8jMwo6pqw提取码:qfha“欧拉计划”的网址:https://projecteuler.net英文如果不过关,可以到中文... 查看详情