Question
n! means n \times (n - 1) \times ... \times 3 \times 2 \times 1.
Find the sum of the digits in the number 100!.
Clojure
#!/usr/bin/env clojureprintln (reduce + (map #(- (int %) 48) (str (reduce * (range BigInteger/ONE 100)))))) (
$ time clojure factorial.clj
real 0m0.759s
user 0m1.254s
sys 0m0.114s
Haskell
sumDigits :: Integer -> Integer
= sumDigits' n 0
sumDigits n where sumDigits' 0 acc = acc
= sumDigits' (div n 10) (acc + (mod n 10))
sumDigits' n acc
factorial :: Integer -> Integer
= foldr (*) 1 [1..n]
factorial n
= print $ sumDigits $ factorial 100 main
$ ghc -O2 -o factorial factorial.hs
$ time ./factorial
real 0m0.002s
user 0m0.000s
sys 0m0.002s
Ruby
#!/usr/bin/env ruby
puts 100.downto(1).inject(:*).to_s.each_char.inject(0) {|s,v|s+v.to_i}
$ time ruby factorial.rb
real 0m0.039s
user 0m0.031s
sys 0m0.008s
Rust
fn main() {
let mut decimal = [0; 200];
0] = 1;
decimal[for n in 1..101 {
let mut carry = 0;
for i in 0..decimal.len() {
let mut digit = decimal[i];
= n * digit + carry;
digit = digit / 10;
carry = digit % 10;
decimal[i] }
}
println!("{}", decimal.iter().sum::<u64>());
}
$ rustc -C target-cpu=native -C opt-level=3 -o factorial_digits factorial_digits.rs
$ time ./factorial_digits
real 0m0.001s
user 0m0.000s
sys 0m0.001s