2017-09-13 79 views
1

一个不合理的小数部分是通过连接 正整数创建:的R - 项目欧拉40:得到最终的数字错了

0.12345678910 112131415161718192021 ...

可以看出,小数部分的第12位数字为1.

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

D1×D10××D100×D1000 D10000×d100000×d1000000

问题源here

我写下面的代码来计算数字:

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 * 。但是,正确的答案是1 * 1 * 5 * 3 * 7 * 2 * 。它只是胜过我,直到最后一位数字才能够产生正确的答案。

回答

2

你的方法给出了正确的答案 - 只需添加L的所有号码:c=0Lnum=num+1L

它出错num=100000c=488894 or 488895。如果没有整数运算,它将使用字符串"1e+05"而不是"100000",这是一个较短的字符。 100001和更高版本不受影响。设置options(scipen=99)将停止它这样做。

2

花了一段时间才弄清楚你想在那里做什么。我认为你有一个有趣的方法,但是我也认为最简单的方法是获取一系列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"