R-项目Euler 40:错误的数字错误



通过串联而产生一个非理性的小数分数 正整数:

0.12345678910 1 112131415161718192021 ...

可以看出,分数部分的第12位为1。

如果DN表示分数部分的n位数字,请找到该值 以下表达式。

D1×D10×D100×D1000×D10000×D100000×D1000000

问题来源。

我编写了以下代码来计算数字:

ans = data.frame(matrix(ncol = 6, nrow=2))
colnames(ans) = c(10,100,1000,10000,100000,1000000)
rownames(ans) = c("length","number")
counter = 1
for(i in c(10,100,1000,10000,100000,1000000))
{
  c = 0
  num = 0
  while (c<i)
  {
    num = num + 1
    c = c + nchar(as.character(num))
  }
  ans[1, counter] = c
  ans[2, counter] = num
  counter = counter + 1 
}

输出为:

> ans
       10 100 1000 10000  1e+05   1e+06
length 11 101 1002 10001 100004 1000004
number 10  55  370  2777  22222  185185

换句话说,当非理性编号长11位时,其最后两个数字是10,这意味着其第10位是1。当非理性数字长1002位时,其最后三位数字为370,这意味着其1000位数字为3。等等。

从中,我得到的答案是:1 * 1 * 5 * 3 * 7 * 2 * 8 。但是,正确的答案是1 * 1 * 5 * 3 * 7 * 2 * 1 。它只是打败了我如何能够产生正确的答案,直到最后数字。

如果强制所有计算与整数算术相强大,则您的方法给出了正确的答案 - 只需将L添加到所有数字:c=0Lnum=num+1L等。

>

num=100000c=488894 or 488895的点上出错。没有整数算术,它使用字符串"1e+05"而不是"100000",这是一个较短的字符。100001及以后不受影响。设置options(scipen=99)将停止这样做。

花了一段时间才弄清楚您要在那里做什么。我认为您有一种有趣的方法,但是我也认为最简单的方法是获得一系列1, 2, 3, ... 10, 11, ... 10000, 10001, 10002 ...并将其倒入一个字符串。然后,您可以使用substr进行字符号1, 10, 100, ..., 1.000.000

vec  <- paste(1:500000, collapse = "")
inds <- 10^(0:6)
digits <- sapply(inds, function(x) substr(vec, x, x))
# [1] "1" "1" "5" "3" "7" "2" "1"

这是python上的解决方案:

from functools import reduce
def elems_total(elem1, elem2):
    return elem1 * elem2
# store the values
fraction = ''.join([str(x) for x in range(1,1000000)])
total = 1
# get [0, 9, 99 ... 999999]
digits_only_9 = [x for x in range(0, 1000000) if x % 9 == 0 and 
                 len(set(str(x))) == 1 and 
                 str(x).endswith('9')]
summa = reduce(elems_total, [int(fraction[i]) for i in digits_only_9])
print(summa)  # 210

相关内容

  • 没有找到相关文章

最新更新