حل لغز الفاكتوريال
السلام عليكم ///
من مجتمع لينكس ، نص السؤال :
حسنا اللغز الذي أضعه من مشروع أويلر Project Euler
اللغز يقول:
العدد 145 عدد ملفت للنظر حيث أن
1! + 4! + 5! = 1 + 24 + 120 = 145أي أن مجموع مضروبات (factorial) الأرقام المكونة ل 145 = 145**لمن لا يعرف ما هو Factorial فهو حاصل ضرب جميع الأرقام من أول 1 حتى ذلك الرقم الذي أدخلته
ويتم التعبير عنه ب “!” هكذا n! حيث n هو الرقم المدخلالسؤال: ما هو مجموع الأرقام التي يساوي كل منها مجموع factorials الأرقام المكونة له (في حدود 1000000)
ملحوظة:بما أن 1!=1 ،2!=2 ليسا مجموع لfactorials فلا تضمنهما في الحل
1! + 4! + 5! = 1 + 24 + 120 = 145أي أن مجموع مضروبات (factorial) الأرقام المكونة ل 145 = 145**لمن لا يعرف ما هو Factorial فهو حاصل ضرب جميع الأرقام من أول 1 حتى ذلك الرقم الذي أدخلته
ويتم التعبير عنه ب “!” هكذا n! حيث n هو الرقم المدخلالسؤال: ما هو مجموع الأرقام التي يساوي كل منها مجموع factorials الأرقام المكونة له (في حدود 1000000)
ملحوظة:بما أن 1!=1 ،2!=2 ليسا مجموع لfactorials فلا تضمنهما في الحل
الحل :
use strict;
sub fact {
my $input = shift;
my $output;
if ( $input > 1 ) {
$output = $input * fact( $input - 1 );
}
else {
$output = 1;
}
return $output;
}
my @results;
for my $number ( 3 .. 1000000 ) {
my @digits = split( //, $number );
my $sum = 0;
foreach (@digits) {
$sum += fact($_);
}
push( @results, $sum ) if ( $number == $sum );
}
print join( ' ', @results );
الناتج :
145 و 40585
ملاحظة لا يوجد معنى لجعل الحد الاعلى مليون لان الناتج لن يتغير و لكن وضعته كما هو مطلوب في سؤالك
—–
مع استخدام مكتبة مساعدة :
كود:
use Math::Combinatorics;
for $number(3..100000){ my $sum; $sum += factorial($_) for (@digits = split(//,$number)); print $sum.' ' if ($number == $sum);}
اسمح لي ان اضع ردي هنا , بعد ان بحثت على ايميلك ولم أجده ولم اجد اي معلومات عن صاحب هذه المدونة , احب ان اقول فقط … انني سعيد جدا بالعثور بالصدفة على مدونتك الرائعة , مواضيع كثير و جميلة و مميزة تروق لي … اعتقد انني ساكون من زوارها الدائمين , واتمنى عليك فقط تحسين تصميم المدونة لانها رائعة بحق … ويسعدني التعرف عليك , يعقوب توفيق , إعلامي , من فلسطين
Great Article very nice