Modern C++チャレンジ 、一章、読書メモ
Modern C++チャレンジ読書会で、C++17の問題集やっているのでRustでも解いてみた。
以下Rust実装。
読書メモ
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関数とか使えば良いのでは
(最適化でなりそうな感じもするけど)
ex7) 友愛数
特になし
ex8) アームストロング数
特になし
ex9) 素因数分解
while使えないと思ってloop使ってるのでC++よりちょっと変な実装にw-。
Rustのfor, while true, loopの速さ比べ|修正中 - Qiita
ex10) グレイコード
この辺りからRust力の不足で、C++からRustにうまく置き換えれてない><。
ex11) ローマ数字に変換
この手の大きい数字から引いていく問題は、競プロの最小枚数のお釣りの払い方と同じとのこと。
Rustでも戻り値が文字列の関数は結局Stringなの?&’static strなの?
ex12) 最長コラッツ数列
Rustの配列indexはusize(32/64bit環境で32/64bitに変化)とのこと。
コラッツ数列が、なんか便利なケースあるのだろうか
ex13) πの計算
調べきれてないけど、Rustの乱数はまだライブラリ整っていない感じ。
genericよくわからんので、普通の関数にした
ex14) ISBNの検証
C++17で無暗にaccumulateやlambdaつかってる感じ。
Rustではsumとか使えればもう少しシンプルなるかな?
Rustに実装してみたの感想
この手の純粋関数だと、ML系で大変書きやすい。 けどforとかの特殊なループをRustでどう書くか、まだまだ馴染んでないので、そのつど悩む。