diff options
| author | 3ter <dritterseinistalles@gmail.com> | 2020-06-23 21:36:00 +0200 |
|---|---|---|
| committer | 3ter <dritterseinistalles@gmail.com> | 2020-06-23 21:36:00 +0200 |
| commit | 198832014560d0ef9c7f1940fddda5fd263b695f (patch) | |
| tree | e2ed3c98e9b2402a7fa52ecac197146b71974457 | |
| parent | f68b9cf5d79b8bd60690fd12d7bc12f48e5d176f (diff) | |
| download | perlweeklychallenge-club-198832014560d0ef9c7f1940fddda5fd263b695f.tar.gz perlweeklychallenge-club-198832014560d0ef9c7f1940fddda5fd263b695f.tar.bz2 perlweeklychallenge-club-198832014560d0ef9c7f1940fddda5fd263b695f.zip | |
add first challenge
| -rw-r--r-- | challenge-066/3ter/ch-1.pl | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/challenge-066/3ter/ch-1.pl b/challenge-066/3ter/ch-1.pl new file mode 100644 index 0000000000..577c8a3d73 --- /dev/null +++ b/challenge-066/3ter/ch-1.pl @@ -0,0 +1,56 @@ +#!/usr/bin/perl +use strict; +use warnings; +use v5.30; + +my ( $num, $den ) = @ARGV; +die 'Please provide two integers e.g. \'ch-1.pl 5 2\'' + if ( !defined($num) or !defined($den) ); + +say "$num//$den = " . divide_integers( $num, $den ); + +sub divide_integers { + my ( $num, $den ) = @_; + + # two edge cases + if ( $den == 0 ) { + return 'n/a'; + } + if ( $num == $den ) { + return 1; + } + + # extract the sign and forget about it later + my $sign = 0; + if ( $num < 0 and $den > 0 or $num > 0 and $den < 0 ) { + $sign = -1; + if ( abs($num) < abs($den) ) { + return -1; + } + } + elsif ( abs($num) < abs($den) ) { + return 0; + } + $num = abs($num); + $den = abs($den); + + # solve division by using addition + my $count_num_in_den = 1; + my $multiples_of_den = 0; + while ( ( $multiples_of_den += $den ) < $num ) { + $count_num_in_den++; + } + + if ( $multiples_of_den > $num ) { + $count_num_in_den--; + } + if ( $sign == -1 ) { + + # floor rounds negative numbers down so the + # absolute value gets one bigger + $count_num_in_den++; + $count_num_in_den = 0 - $count_num_in_den; + } + return $count_num_in_den; +} + |
