2017-09-13 12 views
1

不合理な小数が 正の整数連結して作成されます。R - プロジェクトオイラー40:最後の桁が間違って取得

0.12345678910 112131415161718192021を...

これは、ことがわかります小数部の12桁目は1です。

dnが小数部のn番目の桁を表す場合は、次の式の値 を探します。 d1000000

問題の源here×

D1×D10×D100×D1000×d10000×d100000。

私は数字を計算するために、次のコードを書いた:

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桁の場合、最後の3桁は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の時点で間違っています。整数演算がなければ、"100000"の代わりに"1e+05"という文字列を使用しています。これは1文字短くなります。 100001以降は影響を受けません。 options(scipen=99)を設定すると、これを停止します。

2

ここで何をしようとしているのか分かりません。興味深いアプローチがあると思いますが、最も簡単な方法は、1, 2, 3, ... 10, 11, ... 10000, 10001, 10002 ...のシーケンスを取得して1つの文字列にすることです。そして、あなたは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" 
関連する問題