最近看到一个解题网站Project Euler,只需提供答案。所以可以无所不
用其极,不过聪明人用笔算,高明人用程序算,普通人用Google搜。我大多用的是暴力解决(包括SAGE)。
Problem 40
An irrational decimal fraction is created by concatenating the positive integers:
0.123456789101112131415161718192021...
It can be seen that the 12th digit of the fractional part is 1.
If dn represents the nth digit of the fractional part, find the value of the following expression.
d1 d10 d100 d1000 d10000 d100000 d1000000
本来准备用brute force 的,但是早上上高数没事干,就手写了一个算法。回来调了老半天,终于通了,所以发上来纪念一下。主要是对位数 n 分类讨论:
- 1~9:这个区间上只有一位(1~9),val = n
- (9+1)~(9+90×2):这个区间上有两位(digit = 2,10~99),val = 9 + ceil((n - 9) / 2)的第d = digit - 1 - (n - 9 - 1) - floor((n - 9 - 1) / 2) × 2 位(个位为第0位,十位为第1位,……)。比如:d(11) 是10的个位(0.1~91011……)
- (9+90×2+1)~(9+90×2+900×3):这个区间上有三位(100~999),val = 9 + 90 + ceil((n - 9 - 90×2) / 3)的第d = digit - 1 - (n - 9 - 90×2 - 1) - floor((n - 9 - 90×2 - 1) / 3) × 3 位。比如:d(190) 是100的百位(0.1~99100101……)
In Ruby:
def to_val(n) if n <= 9 return n end len = 0 m = n while m > 0 m -= (len + 1) * 9 * 10 ** len len += 1 end val = 0 r = 0 (0 .. len-2).each do |x| val += 10**x r += (x + 1) * (10 ** x) end num = 9 * val + ((n - 9 * r) / Float(len)).ceil d = n - 9 * r - 1 - ((n - 9 * r - 1) / len) * len #print "#{num}[#{-(len - d)}]/n" return num.to_s[-(len - d)].chr.to_i end #d1 d10 d100 d1_000 d10_000 d100_000 d1_000_000 sum = 1 (0 .. 6).each do |x| sum *= to_val(10**x) end p sum
应该有更简便的算法,比如求模,但我试了几个都不对,就没兴趣了。
当然,最简单的还是蛮力求解。
In Ruby:
f = "0" 1.upto(1000000) { |x| f << x.to_s } chars = f.scan(/./) sum = 1 (0 .. 6).each do |x| sum *= chars[10**x].to_i end p sum