200 choose 1: 200 vs. -1.#IND (1.#QNAN). Rate easy nice easy 1464/s -- -96% nice 34687/s 2270% -- #### #!/usr/bin/perl -w use strict; use Benchmark qw( cmpthese ); sub fact { my $fact = 1; $fact *= $_ for 1..$_[0]; return $fact; } sub nice { my ($n, $r) = @_; my $res = 1; for my $i (1..$r) { $res *= $n--; $res /= $i; } return $res; } while( <> ) { my( $n, $m )= split ' '; my $nice= nice($n,$m); my $easy= fact($n)/fact($m)/fact($n-$m); print "$n choose $m: $nice vs. $easy (",abs($nice-$easy),").\n"; cmpthese( -3, { nice=>sub{nice($n,$m)}, easy=>sub{fact($n)/fact($m)/fact($n-$m)}, } ); }