Project Euler 40
正の整数を順に連結して得られる以下の10進の無理数を考える: 0.123456789101112131415161718192021... 小数第12位は1である. dnで小数第n位の数を表す. d1 × d10 × d100 × d1000 × d10000 × d100000 × d1000000 を求めよ.
Mathematica
digi = Table[10^(i - 1), {i, 7}]; ans = Table[ RealDigits[ChampernowneNumber[], 10, digi[[i]]][[ 1, digi[[i]] ]], {i,Length[digi]}]; Times @@ ans
この数列には名前がついていて、wikipedia:チャンパーノウン定数と言います。この名前を知っているかどうかで問題の難易度が段違いかも。wikipediaにはこれを生成する数式も載っています。
それにしても実質3行。さすがに ChampernownNumber の関数はずるすぎる。
@@ は初めて使ってみました。まだよく使い方がわかっていない。
C/C++
#include <iostream> #include <string> using namespace std; int main(){ string str; char c[10]; for(int i=1 ; str.size()<=1000000 ; i++){ itoa(i, c, 10); str +=c; } int num=1; for(int i=0 ; i<7 ; i++){ char cc = str.at((int)powl(10,i)-1); num *= atoi(&cc); } cout << num << endl; int end; cin >> end; return 0; }
itoaとatoiの使い方をばっちり忘れてました。