ZONeエナジーのプログラミングイベント “HELLO SPACE” の2問目の記事です。
これも当時Rustで作りましたので、紹介します。
(一昨日、1問目の投稿をしましたので、そちらに興味のある方はこちらまで。)
お題2
入力データは整数値の2次元配列。
この中にある素数の個数を求める、というもの。
方針
素数判定はWikipediaに載っていたPythonのコードを参考に、Rustで実装しています。
(参照:https://ja.wikipedia.org/wiki/素数判定#プログラム例)
実装例
question2.rs
use std::io; pub fn is_prime(n: u32) -> bool { if n <= 1 { return false; } if n == 2 { return true; } if n % 2 == 0 { return false; } for i in (3..=( (n as f32).sqrt().ceil() as u32 )).step_by(2) { if n % i == 0 { return false; } } true } fn main() { let mut input = String::new(); let mut primes_count = 0; while io::stdin().read_line(&mut input).unwrap() > 0 { input .trim() .split_whitespace() .for_each(|s| { let n: u32 = s.parse().unwrap(); if is_prime(n) { primes_count += 1; } }); input.clear(); } println!("{}", primes_count); }
入力テキスト
question2.txt
2 3 2 5 6 6 7 4 6 2 4 4 14 8 1 9 15 17 5 19 2 2 2 7 7 1 8 6 15 11 4 15 17 26 9 7 21 4 13 10 4 3 2 1 16 4 8 15 26 9 19 11 31 29 9 38 24 27 21 34 3 6 12 8 1 4 23 6 7 26 38 47 36 19 45 28 40 33 9 19 3 5 1 15 5 3 10 20 6 19 15 33 19 27 41 12 66 59 33 35 7 10 10 13 30 2 42 3 55 54 4 51 67 39 59 10 30 2 25 73 4 6 14 16 2 5 48 53 45 62 32 19 26 18 95 63 112 99 112 48 6 5 10 10 11 26 24 55 64 30 65 87 57 60 110 28 127 17 50 78 7 2 12 1 40 22 5 27 58 16 31 15 92 63 128 5 95 159 100 161 6 16 23 28 13 14 5 30 40 70 95 6 32 58 109 138 31 131 110 106 2 18 12 42 40 35 72 48 33 12 112 63 122 9 118 115 187 17 164 34 2 20 32 20 58 56 65 95 80 112 123 24 100 110 1 125 29 70 150 211 7 17 30 10 63 69 43 41 5 84 47 124 21 60 109 65 37 97 57 258 5 20 36 30 64 62 95 112 84 93 6 68 8 106 138 69 197 133 133 106 14 16 7 53 28 47 52 55 7 38 143 17 62 104 61 199 235 124 166 280 16 3 36 51 16 38 45 46 9 24 75 87 94 127 73 50 229 38 132 234 4 12 27 25 46 61 118 55 145 80 157 129 158 218 106 185 286 64 45 147 5 30 13 12 24 25 52 84 157 131 78 177 89 158 96 121 293 306 324 188 9 2 7 8 52 78 107 148 49 105 192 104 116 252 202 96 227 258 211 367 12 10 41 48 4 87 107 102 28 143 24 99 8 234 171 34 72 320 33 295
使用例
>question2.exe < question2.txt
出力結果
108
ソースコードについて
is_prime()関数の中で一番複雑な式は
for i in (3..=( (n as f32).sqrt().ceil() as u32 )).step_by(2) {
ですが、sqrt()って関数じゃなくてメソッドなんですね。これはなんか気持ち悪い。普通の数式なんだからsqrt()関数として使いたいなと。
なんかやりようがあるんですかね。sqrt()を関数として使う方法。
あったらどなたか教えていただけると嬉しいです(;´∀`)