Problem34

30分プログラム、その307。Problem34 - Project Euler

145は面白い数である. 1! + 4! + 5! = 1 + 24 + 120 = 145となる.
各桁の数の階乗の和が自分自身と一致するような数の総和を求めよ.
注: 1! = 1 と 2! = 2 は総和に含めてはならない.

なんか、前々回ぐらいと似てるなぁ。
ざっと概算してみたところ、7桁まで探索する必要があったけれども、なぜか5桁で十分だった。まあ、解けたからいいや。

使い方

$ time perl problem34.pl
145
40585
Answer: 40730
perl problem34.pl  7.03s user 0.07s system 87% cpu 8.131 total

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# problem34.pl -
#
# Copyright(C) 2008 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2008/05/18 22:31:29
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#
use strict;
use warnings;
use Data::Dumper;
sub fact($){
    my ($n) = @_;
    if($n == 0){
	1;
    }else{
	$n * &fact($n-1);
    }
}

sub split_digit($){
    my ($n) = @_;
    split //,$n;
}

sub sum(@){
    my $sum = 0;
    for (@_){
	$sum += $_;
    }
    $sum;
}

my $sum = 0;
for (3..1e5){
    if(sum(map { fact($_) } split_digit($_)) == $_){
	$sum += $_;
	print $_,"\n";
    }
}

print "Answer: ",$sum,"\n";