Project Euler 34
145は面白い数である. 1! + 4! + 5! = 1 + 24 + 120 = 145となる. 各桁の数の階乗の和が自分自身と一致するような数の総和を求めよ. 注: 1! = 1 と 2! = 2 は総和に含めてはならない.
Mathematica
ans = 0; For[i = 3, i < 100000, i++ If[i == Total[IntegerDigits[i]!], ans += i, {} ] ] ans
これはMathematicaが卑怯といわざるを得ません。他の言語ならもっとめんどくさいはず。
配列に対して階乗「!」を適用できるのが強力です。
C/C++
#include <iostream> using namespace std; // nの階乗を返す int factorial(int n){ if(n==0 || n==1) return 1; int k=1; for(int i=2 ; i<=n ; i++){ k*=i; } return k; } int main(){ int total=0; for( int i=3 ; i<100000 ; i++){ int num = i; int dig; int sumdig = 0; while(num!=0){ dig = num%10; sumdig += factorial(dig); num /= 10; } if(i==sumdig){ total += i; cout << i << endl; } } cout << endl << total << endl; int end; cin >> end; return 0; }
「これでいいのか・・・?」ってすごく不安だった。答え少なすぎです