Problem 40 » 履歴 » リビジョン 2
リビジョン 1 (Noppi, 2024/01/15 06:54) → リビジョン 2/3 (Noppi, 2024/01/15 07:24)
[ホーム](https://redmine.noppi.jp) - [[Wiki|Project Euler]]
# [[Problem 40]]
## Champernowne's Constant
An irrational decimal fraction is created by concatenating the positive integers:
$$0.12345678910{\color{red}\mathbf 1}112131415161718192021\cdots$$
It can be seen that the $12$<sup>th</sup> digit of the fractional part is $1$.
If $d_n$ represents the $n$<sup>th</sup> digit of the fractional part, find the value of the following expression.
$$d_1 \times d_{10} \times d_{100} \times d_{1000} \times d_{10000} \times d_{100000} \times d_{1000000}$$
## チャンパーノウン定数
正の整数を順に連結して得られる以下の10進の無理数を考える:
$$0.12345678910{\color{red}\mathbf 1}112131415161718192021\cdots$$
小数第12位は1である.
$d_n$ で小数第$n$位の数を表す. $d_1 \times d_{10} \times d_{100} \times d_{1000} \times d_{10000} \times d_{100000} \times d_{1000000}$ を求めよ.
```scheme
(import (scheme base)
(gauche base)
(scheme flonum))
(define (digit-of-num n)
(assume (exact-integer? n))
(assume (<= 0 n))
(if (zero? n)
1
(+ (floor->exact (fllog10 n))
1)))
(define (number-list n)
(assume (exact-integer? n))
(assume (<= 0 n))
(if (zero? n)
'(0)
(let loop ([rest n]
[count (digit-of-num n)]
[result '()])
(if (<= rest 0)
result
(loop (div rest 10)
(- count 1)
(cons (mod rest 10)
result)))))) result)))))
(define (champernowne d) champernowne
(let ([result (make-vector (+ d
(digit-of-num d)
1))]) 100_0008)])
(let loop1 ([current 1] [pos 1])
(if (< d 100_0000 pos)
result
(let loop2 ([count (digit-of-num current)]
[numlis (number-list current)]
[pos pos])
(cond
[(<= count 0)
(loop1 (+ current 1) pos)]
[else
(vector-set! result pos (car numlis))
(loop2 (- count 1)
(cdr numlis)
(+ pos 1))]))))))
(define answer-40
(let ([cn100_0000 (champernowne 1000000)])
(* (vector-ref cn100_0000 champernowne 1)
(vector-ref cn100_0000 champernowne 10)
(vector-ref cn100_0000 champernowne 100)
(vector-ref cn100_0000 champernowne 1000)
(vector-ref cn100_0000 champernowne 1_0000)
(vector-ref cn100_0000 champernowne 10_0000)
(vector-ref cn100_0000 100_0000)))) champernowne 100_0000)))
(format #t "40: ~d~%" answer-40)
```