삼각수, 오각수, 육각수는 아래 식으로 구할 수 있습니다.
삼각수 Tn = n (n + 1) / 2 1, 3, 6, 10, 15, … 오각수 Pn = n (3n − 1) / 2 1, 5, 12, 22, 35, … 육각수 Hn = n (2n − 1) 1, 6, 15, 28, 45, … 여기서 T285 = P165 = H143 = 40755 가 됩니다.
오각수와 육각수도 되는, 그 다음으로 큰 삼각수를 구하세요.
이전 44번 문제를 풀었다면, n각수 판별식을 쉽게 만들 수 있다. 이를 이용하면 된다.
이 때, 변수가 정수인지 판별하는 함수가 필요한데, Scalar::Util::Numeric 모듈의 isint 함수를 사용해도 되겠지만, 정규식을 이용하여 판별하여도 성능상 크게 관계가 없다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/usr/bin/env perl use 5.010; use strict; use warnings; my $c = 285; while($c++) { my $n = $c*($c+1)/2; if (((1+sqrt(1+24*$n))/6) =~ m/^d+$/ and ((1+sqrt(1+8*$n))/4) =~ m/^d+$/){ say $n; exit; } } |