フィボナッチ数列
プログラミングネタ
フィボナッチ数列のうち、各桁の数字を足した数で割り切れる数を以下の例に続けて小さいほうから5個求めてください。 2 → 2 ÷ 2 3 → 3 ÷ 3 5 → 5 ÷ 5 8 → 8 ÷ 8 21 → 21 ÷ 3・・・2 + 1= 3で割る 144 → 144 ÷ 9・・・1 + 4 + 4 = 9で割る
これはメモ化と大きな桁を扱う事についての問題です。
perlであれば、use bignum;を使うことで対処出来ます。
このbignum初めて知った。
use strict; use warnings; use bignum; my $before = 0; my $cnt = 0; my @memo; my $n = 1; while(1){ my $fibona = fibo($n); my $fibo_div = $fibona / sp($fibona); if($fibo_div == int($fibo_div)){ $cnt++; if($cnt > 7){ print "$fibona\n"; } if($cnt > 11){ last; } } $n++; } sub fibo{ my $num = shift; unless (defined $memo[$num]){ if(($num == 0) || ($num == 1)){ $memo[$num] = 1; }else{ $memo[$num] = fibo($num - 2) + fibo($num - 1); } } return $memo[$num]; } sub sp{ my @ret = 0; my $n = shift; @ret = split(//,$n); my $total = 0; foreach my $sum (@ret){ $total += $sum; } return $total; }
perl q11.pl 2584 14930352 86267571272 498454011879264 160500643816367088