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の使い方をばっちり忘れてました。