EDIT: For some reason, a few numbers such as 1035 are causing errors (Can't take sqrt of -1, <STDIN> line 1.) Going to have to hunt down the bug and fix it...
EDIT: Just needed a slight change to the first line after BING to prevent tget calls for 0:
use strict;
use warnings;
my ($i, $j, $inum, $jnum, $left);
$| = 1; print "Enter the number to check : ";
my $inp = <STDIN>;
BING:
for ($i = tget($inp-2); $i; $i--) {
$inum = tmake($i);
$left = tget($inp - $inum - 1) + 1;
for ($j = 1; $j < $left; $j++) {
$jnum = tmake($j);
last BING if (tis($inp - $inum - $jnum));
}
}
print " Your triangles are : $inum $jnum "
. ($inp - $inum - $jnum) . "\n";
sub tget { return int(sqrt(1 + $_[0] * 2) - .5); }
sub tmake { return (.5 * $_[0] * ($_[0] + 1)); }
sub tis { my $n = shift; return ($n == tmake(tget($n))); }
Incidently, I ran a looped version of this for all numbers 3-100000, and only the following could not be made with sums of three triangles:
4, 6, 11, 20, 29
As far as I can tell, all integers after 29 can be made with at least one sum of three triangles. The number of sums increases as you go along.