通过串联而产生一个非理性的小数分数 正整数:
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=0L
,num=num+1L
等。
在num=100000
和c=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