Rust 㧠ProjectEuler #1 ~ #3
æ¾ç½®ç¶æ
ã«ãªã£ã¦ããProject Eulerãåéãã¦ã¿ããã¨ã«ãã¾ããã以åã¯Haskellã§Prob. 133ã¾ã§è§£ãã¦Haskellã«æ
£ãããã¨ãã§ããã®ã§ãä»åã¯Rustã§æ¸ãã¦ã¿ããã¨æãã¾ããHaskellã¯æå¾ã¾ã§ä½¿ãããªãã¦ãæã¯åºãªãã£ãã®ã§ãããé
延è©ä¾¡ã§ã¯ãªãRustãªãç´æçã«è¨ç®éã¨ãç解ã§ãã¦ãããããã¯ãâ¦ï¼
ã¨ããããã§ã解ãã¦ããã¾ã
Problem 1
1000以ä¸ã®æ°åã§3ã5ã§å²ãåãããã®ã®åãæ±ããåé¡ãæåãªã®ã§ç´ ç´ã«æ¸ããã
use std; fn main() { let sum = 0u; uint::range(0u, 1000u) { |n| if n % 3u == 0u || n % 5u == 0u { sum += n; } } std::io::println(#fmt("%u", sum)); }
ç¹ã«ç¹çäºé ã¯ç¡ãã
Problem 2
400ä¸ä»¥ä¸ã§å¶æ°ã®ãã£ããããæ°ã®åãæ±ããåé¡ã
use std; pure fn fib(prev: uint, cur: uint) -> (uint, uint) { ret (cur, prev + cur); } fn main() { const MAX: uint = 4000000u; let (prev, cur) = (1u, 1u); let sum = 0u; while cur < MAX { if (cur % 2u == 0u) { sum += cur; } let (prev2, cur2) = fib(prev, cur); prev = prev2; cur = cur2; } std::io::println(#fmt("%u", sum)); }
ãããæ®éã§ãããæ¬å½ã¯
(prev, cur) = fib(prev, cur);
ã£ã¦æ¸ãããã£ããã§ãããå°ãªãã¨ãç¾æç¹ã§ã¯ããã®æ¹æ³ã§ã¯åå²ä»£å ¥ã¯ã§ããªãã¿ããã§ãã
Problem 3
600851475143 ã®æ大ã®ç´ å æ°ãæ±ããåé¡ã
use std; fn gen_prime(primes: [mutable u64]) -> [mutable u64] { let num = alt vec::last(primes) { none { ret [mutable 2u64] } some(2u64) { ret primes + [mutable 3u64] } some(x) { x + 2u64 } }; while true { for p in primes { if p * p > num { ret primes + [mutable num]; } if num % p == 0u64 { break; } } num += 2u64; } fail; } fn main() { let primes = gen_prime([mutable]); let num = 600851475143u64; while num != 1u64 { check vec::is_not_empty(primes); let p = vec::last_total(primes); while num % p == 0u64 { num /= p; std::io::println(#fmt("%u", p)); } primes = gen_prime(primes); } }
ã¨ã©ãã¹ããã¹ã®ç¯©ã§ç´ æ°ãªã¹ããä½ã£ã¦ãå
é ããå²ã£ã¦ãã£ã¦ãã¾ãã
äºåæ¢ç´¢ããã¾ãåããªãã¦ä½åº¦ãæ¸ãç´ããã®ã¯ããã ãã®ç§å¯ãå¢çæ¡ä»¶ã¯ã¡ããã¨èãã¦ããæ¸ããªãã¨ã ãã§ããã
ã¨ãããããæåã®ã¨ã³ããªã¯ããã¾ã§ãããããã©ãã©ãã¨ã³ããªç«ã¦ã¦è¡ãäºå®ãå°ç¨ããã°ä½ã£ã¦ãããã®ããã