是这样的
在刷Leetcode的时候,有时候我们必须预处理出某些东西
比如预处理一下小于10^6的素数
理论上有两种处理方法,一种是,把所有素数都写到一起,弄个
const prime:[i32;78498]=[2,3,5,7,......];
但传几万个素数上去相当影响编译效率(还有代码可读性)
另一种应该是使用const fn,但stable版本暂时不支持const fn持有可变借用
就算nightly版...nightly告诉我,不允许出现for循环
想问一下,如果想做预处理(提前用const存那几万个素数)又不希望把那几万个素数都写在const里面,我应该怎么做。
有什么可以绕过Rust限制的奇怪姿势吗?
1
共 7 条评论, 1 页
评论区
写评论绕过上传代码文件大小的限制不是一个正常的需求…… 刷OJ不用在意那么多吧,leetcode我刷的少,我在别的OJ上刷题都是直接运行时算的,没有遇到用这个卡时限的,这么卡也没有意义。
关键问题是提前打表会让提交文件的尺寸膨胀好多好多啊
有时候竞赛要求文件小于50K,那么想打1M表的野心基本可以宣告破产,但编译期计算没这个问题
--
👇
gwy15: 要提前打表都是算好写 hardcode 吧?楼主是想做编译期计算?(类似 c++ 的模板 meta programming?)
编译期运算编译起来不可能比提前打表更快啊 = =
要提前打表都是算好写 hardcode 吧?楼主是想做编译期计算?(类似 c++ 的模板 meta programming?)
编译期运算编译起来不可能比提前打表更快啊 = =
但总觉得这样的做法
include!必须引用一个文件
也就是我们必须在哪里生成/记录这些素数分别是什么
总觉得有点浪费空间的意思
不过……总算学到一个引入外部数据的方法
以后,至少可以试着把const存到其他文件中以增加代码可读性了
BTW,总觉得论坛的分割线写错了
正确的分割线是
而
似乎变不成分割线
👇
Mike Tang: 把公用逻辑抽成crate,是可以两边用的。
把公用逻辑抽成crate,是可以两边用的。
看上去include!的用处只是把表达式复制过去
并不能在预处理的时候进行常量计算的
如果希望读取几万个素数,我们只能预先把素数算好,然后存起来,然后用include!读取
用build.rs算,include!()引用,需要把代码分散到许多不同的文件中,总觉得有点难以维护
……不过无论如何,这大概也算一种方法吧……
👇
Mike Tang: build.rs + include!() 满足你的需求。
build.rs + include!() 满足你的需求。