/
euler_12.pl
66 lines (59 loc) · 1.5 KB
/
euler_12.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/perl
use strict;
use warnings;
use Carp;
use Getopt::Long;
use Data::Dumper;
use bignum;
#PROBLEM 12
#~ The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be:
#~ 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
#~
#~ Let us list the factors of the first seven triangle numbers:
#~
#~ 1: 1
#~ 3: 1,3
#~ 6: 1,2,3,6
#~ 10: 1,2,5,10
#~ 15: 1,3,5,15
#~ 21: 1,3,7,21
#~ 28: 1,2,4,7,14,28
#~ We can see that 28 is the first triangle number to have over five divisors.
#~
#~ What is the value of the first triangle number to have over five hundred divisors?
my ( $ceiling, $help );
GetOptions(
'c|ceiling=i' => \$ceiling,
'h|help' => \$help,
);
( $ceiling && !$help ) or die <<USAGE;
Usage: $0
-c|--ceiling <number of divisors>
-h|--help <this message>
USAGE
my $notfound = 1;
my $pointer = 1;
my $triangle = 0;
while ( $notfound ) {
$triangle += $pointer;
$pointer++;
my @products = getproducts( $triangle );
my $numprod = scalar @products;
$notfound = 0 if $numprod > $ceiling;
#print "$triangle ",join(',', @products), " -> [$numprod]\n";
}
print "$triangle\n";
sub getproducts
{
my ($num) = @_;
my %rethash;
for (my $i = 1; $i < (sqrt($num) + 1); $i++) {
if ($num % $i == 0) {
my $j = $num / $i;
$rethash{$i} = 1;
$rethash{$j} = 1;
}
}
my @retarray = sort { $a <=> $b } keys %rethash;
return @retarray;
}