最近看到一个解题网站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
主要是对位数 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