Problem 34 : Digit factorials
145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145.
Find the sum of all numbers which are equal to the sum of the factorial of their digits.
Note: as 1! = 1 and 2! = 2 are not sums they are not included.
C++ source code
#include <iostream>
#include <vector>
#include <iterator>
#include <cassert>
#include <ctime>
using namespace std;
class PE0034
{
private:
static const int MAX = 100000;
int getFactorial(int number);
int m_DigitFactorial[10];
public:
PE0034();
int getSumOfDigitsFactorial(int number);
int getSumOfNumbersEqualToDigitFactorials();
};
PE0034::PE0034()
{
m_DigitFactorial[0] = 1;
for(int i=1; i<=9; i++)
{
m_DigitFactorial[i] = i*m_DigitFactorial[i-1];
}
}
int PE0034::getFactorial(int number)
{
int factorial = 1;
for(int i=2; i<=number; i++)
{
factorial *= i;
}
return factorial;
}
int PE0034::getSumOfDigitsFactorial(int number)
{
int sum = 0;
while(number> 0)
{
sum += m_DigitFactorial[number%10];
number /= 10;
}
return sum;
}
int PE0034::getSumOfNumbersEqualToDigitFactorials()
{
int sum = 0;
for (int number=3; number<MAX; number++)
{
if (number == getSumOfDigitsFactorial(number))
{
#ifdef UNIT_TEST
cout << number << " is a curious number" << endl;
#endif
sum += number;
}
}
return sum;
}
int main()
{
clock_t start = clock();
PE0034 pe0034;
assert (145 == pe0034.getSumOfDigitsFactorial(145));
cout << "The sum of all numbers which are equal to the sum of the ";
cout << "factorial of their digits is " ;
cout << pe0034.getSumOfNumbersEqualToDigitFactorials() << endl;
clock_t finish = clock();
double duration = (double)(finish - start) / CLOCKS_PER_SEC;
cout << "C/C++ running time: " << duration << " seconds" << endl;
return 0;
}
Python source code
def initializeFactorialList():
"""
factorialList = [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
"""
factorialList = [1]
for i in range(1, 10):
factorialList.append(factorialList[i-1]*i)
return factorialList
def getSumOfDigitsFactorial(number, factorialList):
sumOfDigitsFactorial = 0
while number > 0:
sumOfDigitsFactorial += factorialList[int(number%10)]
number = int(number/10)
return sumOfDigitsFactorial
def getSumofNumbersEqualToDigitFactorials(factorialList):
sumOfNumbers = 0
for number in range(3, 100000):
if number == getSumOfDigitsFactorial(number, factorialList):
sumOfNumbers += number
return sumOfNumbers
def main():
factorialList = initializeFactorialList()
assert 145 == getSumOfDigitsFactorial(145, factorialList)
print("The sum of all numbers which are equal to the")
print("sum of the factorial of their digits is",
getSumofNumbersEqualToDigitFactorials(factorialList))
if __name__ == '__main__':
main()