Project Euler .net

    最近看到一个解题网站Project Euler,只需提供答案。所以可以无所不

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. 1~9:这个区间上只有一位(1~9),val = n
  2. (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……)
  3. (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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值