Modern C++チャレンジ 、一章、読書メモ

Modern C++チャレンジ読書会で、C++17の問題集やっているのでRustでも解いてみた。

以下Rust実装。

impl with Rust · GitHub

読書メモ

Rust実装での差分点や、読書会での脱線めも。

ex1) 3または5で割り切れる正の整数の総和

普通

ex2) 最大公約数

特になし

ex3) 最小公倍数

特になし

ex4) 与えられた正の整数より小さい最大の素数

C++での「for (int i = 5; i * i <= num; i += 6)」を、
Rustで「for i in (5..).step_by(6).take_while(|m| m*m <= num) 」

上記で、「i+=6」や「step_by(6)」なのは、以下6step毎に繰り返すから?

5, 6(2x, 3x), 7, 8(2x), 9(3x),10(2x),
11,12(2x, 3x),13,14(2x),15(3x),16(2x),  ...

なので、次のif文「if (num % i == 0 || num % (i + 2) == 0)」で、
「5, 7(i+2)」「11, 13(i+2)」をチェックすれば素数判定できる。

ex5) セクシー素数

特になし

ex6) 過剰数

商と余の両方「if (number % i == 0)」と「result += (i == (number / i)) ? i : (i + number / i);」を計算するなら
一括で出来るdiv関数とか使えば良いのでは

(最適化でなりそうな感じもするけど)

ja.cppreference.com

ex7) 友愛数

特になし

ex8) アームストロング数

特になし

ex9) 素因数分解

while使えないと思ってloop使ってるのでC++よりちょっと変な実装にw-。

Rustのfor, while true, loopの速さ比べ|修正中 - Qiita

ex10) グレイコード

この辺りからRust力の不足で、C++からRustにうまく置き換えれてない><。

ex11) ローマ数字に変換

この手の大きい数字から引いていく問題は、競プロの最小枚数のお釣りの払い方と同じとのこと。

Rustでも戻り値が文字列の関数は結局Stringなの?&’static strなの?

qiita.com

ex12) 最長コラッツ数列

Rustの配列indexはusize(32/64bit環境で32/64bitに変化)とのこと。

コラッツ数列が、なんか便利なケースあるのだろうか

ex13) πの計算

調べきれてないけど、Rustの乱数はまだライブラリ整っていない感じ。

qiita.com

genericよくわからんので、普通の関数にした

qiita.com

ex14) ISBNの検証

C++17で無暗にaccumulateやlambdaつかってる感じ。
Rustではsumとか使えればもう少しシンプルなるかな?

Rustに実装してみたの感想

この手の純粋関数だと、ML系で大変書きやすい。 けどforとかの特殊なループをRustでどう書くか、まだまだ馴染んでないので、そのつど悩む。

gist.github.com