Dreieckszahlen, Fünfeckzahlen und Sechseckzahlen werden wie folgt erzeugt.
Dreieck Tn = n (n + 1) / 2 1, 3, 6, 10, 15, ... Fünfseitige Zahl Pn = n (3n-1) / 2 1, 5, 12, 22, 35, ... Sechseckzahl Hn = n (2n-1) 1, 6, 15, 28, 45, ... Es stellt sich heraus, dass T285 = P165 = H143 = 40755.
Suchen Sie die folgenden dreieckigen, fünfeckigen und sechseckigen Zahlen. http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2045
Jeder Term einer hexagonalen Zahl ist ein ungerader Term einer dreieckigen Zahl, aber ich habe diese Tatsache ignoriert und über einen Mechanismus nachgedacht, der alle Terme vorerst gleich macht.
from mytools import *
def t(n):
return n*(n+1)/2
def p(n):
return n*(3*n-1)/2
def h(n):
return n*(2*n-1)
@get_time
@main_start
def main():
#(TRI_START,PEN_START,HEX_START) = (2, 2, 2)
(TRI_START,PEN_START,HEX_START) = (286, 166, 144)
MAX = 10**8
tri_gene = ( t(n) for n in xrange(TRI_START, MAX))
pen_gene = ( p(n) for n in xrange(PEN_START, MAX))
hex_gene = ( h(n) for n in xrange(HEX_START, MAX))
ang_list = [
{'value': tri_gene.next(), 'gene': tri_gene},
{'value': pen_gene.next(), 'gene': pen_gene},
{'value': hex_gene.next(), 'gene': hex_gene}
]
ang_max = max(ang_list[0]['value'], ang_list[1]['value'], ang_list[2]['value'])
flag = False
while not flag:
flag = True
for ang in ang_list:
if ang['value'] < ang_max:
ang['value'] = ang['gene'].next()
flag = False
if ang['value'] > ang_max:
ang_max = ang['value']
print ang_max
main()
Recommended Posts