算額あれこれ

算額問題をコンピュータで解きます

2014-11-01から1ヶ月間の記事一覧

階乗とベンフォードの法則

8 バイト実数では,普通に階乗を計算しようとすると 171! は計算できない。> prod(1:170)[1] 7.257415615308e+306> prod(1:171)[1] Inf> factorial(171)[1] Inf 警告メッセージ: In factorial(171) : 'gammafn' 中の値が範囲を超えています フィボナッチ数列…

問題:大きな数の先頭と末尾

特別なライブラリや関数を用いずに,8 の 10000000 乗(8 ^ 1e7)の先頭 4 桁と末尾 4 桁を求めよ。 解答例はコメントを参照

フィボナッチ数列とベンフォードの法則

フィボナッチ数列は急速に大きくなり,普通に計算するとオーバーフローしてしまう。8 バイト実数での有効数字 16 桁なので,79 項目は 14472334024676220 と正確に表示できるが,それ以降は上位桁しかわからない。1476 項目は 1.306989e+308 となるが,1477 …

数理パズルなど

「難しいパズルを解きたい」と思うのは,「パズルを解くのが面白いから」というのが動機だろう パズルを解く参加者に制限を加えたり,正解が開示されなかったり,期限(?)が過ぎたら問題自体が参照できなくなったり,最初提示された締め切り日がズルズルズ…

サルベジオン社で宇宙船のデータを救え

「サルベジオン社で宇宙船のデータを救え」とのことで... 問題 1. キーは昇順になっているので,二分法で探索する。 求める値は "V406435859539156181269150751031" library(gmp)url = "http://salvageon.textfile.org/?db=1&index=%s"key = as.bigz("208050…

2007 円ぶんの切手を買う方法

1 円,2 円,10 円,52 円,82 円,280 円の切手を合計が 2007 円になるように買う方法を求めよ。ただし,買う枚数を最小にせよ。素直に考えて,280 円切手を 7 枚,10 円切手を 4 枚,2 円切手を 3 枚,1 円切手を 1 枚,つまり,280*7 + 10*4 + 2*3 + 1*1 …

2 進表記と BCD 表記

2 桁の整数のうち,2 進数表記と BCD 表記に含まれる 1 の個数が同じになる整数はいくつあるか。 馬鹿馬鹿しい問題だけど... # 2 進数表記に含まれる 1 の個数bin = function(n) { count = 0 repeat { count = count + n %% 2 n = n %/% 2 if (n == 0) retur…

金額最安経路

エネルギー最短経路の問題と同じ。ただ,対称行列であるところが違うが。 効率がよいか悪いか分からない新しい言語(?)を覚えるまでもない。 route = matrix(c(0, 200, 200, 390, 160, 220,200, 0, 160, 220, 220, 310,200, 160, 0, 310, 220, 310,390, 22…

2 進数で表したとき,ビットが 1 の個数が等しい連続する整数の組数

1~2014 までの数を 2 進数で表したときに,連続する 2 数の 1 の個数が同じであるようなペアは何組存在するか連続する数のうち,(1, 2),(5, 6), (9, 10), ...のように, (4(i-1)+1, 4(i-1)+2),i = 1, 2, ... の 2 数の 1 の個数が等しくなる。よって,n ま…

1~100にある素数を列挙

20 分で答よということなので,できるだけ無精をすることにすると... library(gmp)p = 1repeat { p = nextprime(p) if (p > 100) break print(as.integer(p))}

排他論理和でパスカルの三角形もどき

「パスカルの三角形」は「右上の数と左上の数の和」を配置するが,「和」ではなく「排他的論理和」を使う場合を考える。2014番目の「0」が出力されるのは何段目になるか? 規則性もあるだろうが,たかが 2014 番目なので,多めに見積もって,馬鹿正直なプロ…

妙な(?)数列の一般項

「どの桁にも 0, 3, 6, 9 が表れない」という条件を満たす正の整数を小さい順に並べて以下のような数列を作る。 1, 2, 4, 5, 7, 8, 11, 12, 14, 15, 17, 18, 21, 22, ...この数列の 30 番目の項は 58 である。では,この数列の 10^7 番目の項を求めよ。n 番…

整数の約数の個数

library(gmp)func = function(n) { a = factorize(n) # 素因数分解 u = unique(a) # ユニークな素因数 b = numeric(length(u)) # 同じ素因数の個数 for (i in 1:length(a)) { suf = which(as.character(a[i]) == u) b[suf] = b[suf]+1 } return(prod(b+1)) #…

ネイピア数(e)の近似式(2)

library(e1071)d = permutations(7)a = d[,1] ^( (d[,2]/10+d[,3]/10)^(-d[,4]/10)-d[,5]^(-d[,6]-d[,7]/10))p = which.min(abs(a-exp(1)))d[a==a[p],]a[p] [,1] [,2] [,3] [,4] [,5] [,6] [,7][1,] 2 1 3 4 5 7 6[2,] 2 3 1 4 5 7 6

まじか...

> プログラムを書いて、19670808という10進数で表されている数を2進数に変換して登場する最後の数字を調べてくれ! 偶数なんだからさぁ,0 に決まっているじゃん。 って,「登場する最後の数字」って,末尾の数字のことなんだろ?

三角形の種類はいくつか

円周上を n 等分する点を,順に「点 1」から「点 n」とする。これらの点から m 個の点を選ぶ( m ≦ n )。m 個の点において,その内の 3 個の点を頂点とする三角形は mC3 個あるが,形の異なるものはいくつあるか。ただし,裏返さずに回転してぴったり重ねら…

combn の FUN 引数で定義する関数に注意

かなり,はまった。簡単な例を挙げよう。combn(10, 5, function(x) print(sum(x)))は無問題だが,combn(10, 5, function(x) cat(sum(x)))は 以下にエラー matrix(r, nrow = len.r, ncol = count) : 'data' はベクトル型でなくてはなりませんが、'NULL' でし…

総当たり足し算

図のような,「サグラダ・ファミリア」の「受難のファサード」にある魔方陣で下記の条件で足し算をした結果,その和が同じになる組み合わせが最も多くなるような値(和)を求めよ。 ・足し合わせるのは、縦、横、斜めに限らない ・足し合わせる数字の個数は4つ…

Hello world! を出力するプログラム

まあ,2 つの言語である文字列を書けということだけど,むしろ同じ言語でどんなバリエーションがあるかのほうが面白いんだろうなあ。 コマンドラインでやる。一行野郎だ。 R でちょっと凝ったやり方? Rscript -e 'cat(rawToChar(as.raw(c(73, 32, 108, 111,…

ネイピア数(e)の近似式

A ~ H に 1 から 8 までの数字をあてると、式の結果が自然対数の底、ネイピア数(e=2.7182818284590…)に極めて近い値となる。 まあ,虫食い算ではある。しかし,一筋縄ではいかぬ。 n を大きくすると,e ≒ (1+1/n)^n になるということを利用したもの。B^(10*…

フィボナッチ数列(またか)

1,1,2,3から始まるフィボナッチ数列の100桁目の数字は何かn = 30fib = integer(n)fib[1] = fib[2] = 1for (i in 3:n) { fib[i] = fib[i-1]+fib[i-2]}ans = paste(fib, collapse="")if (nchar(ans) >= 100) { substring(ans, 100, 100)}

最大公約数で公開鍵を生成

1 から 100 までの素数を 2 つ選び,それぞれ p, q とする。以下の 2 つの条件を満たす自然数 e が p + q 個になるような p, q の組み合わせをすべて求めよ。条件1:0 < e < (p - 1)(q - 1)条件2:gcd( (p - 1)(q - 1), e) = 1 ( (p - 1)(q - 1) と e の最…

一行野郎(2)

180 以上 189 以下の 10 個の整数の中から異なる 3 個 a, b, c を選び,和が 560 になる組み合わせを全て求めるワンライナーを書け。Rscript -e "n = 180:189; a = 179+which(outer(outer(n, n, '+'), n, '+') == 560, arr.ind=TRUE); b = a[,1] < a[,2] & a…

一行野郎

異なる 3 桁の整数 a, b, cが,以下の条件を満たすとき,a, b, c を求めるワンライナーを書け 1. aはbより261小さい。 2. aはcより333大きい。 3. cはbの100の位の数と一の位の数を入れ替えた数である。 4. aは7の倍数である。まあ,結果出力が微妙だけど。R…

A/B テストには気をつけろ

http://postd.cc/optimizely-got-me-fired/ 生兵法は大怪我のもと

言語の得手・不得手

国語・数学・英語・社会・理科5科目の採点結果が、CSVファイルに保存されています。5科目合計点の順位をそれぞれ算出し、結果をCSVファイルとして出力する。 プログラミング言語は、PHPを使ってください。 点数が高い順に、1, 2, ...と順位をつけるだけです…

真意は何処に

> フィボナッチ数列で500を超えるまでに何個の数値を記述する必要があるか どうせなら,「5e100 を超えるまでに」とかいえばよいのに(^_^) せめて,「最小文字数で」とか a = b = 1n = nchar(a) + nchar(b)repeat { c = a + b cat(c) n = n + nchar(c) if…

ユークリッドの互除法の計算過程

1 から整数 n までの間の数から二数を選びユークリッドの互除法で最大公約数を求めるとき,割り算の回数が最大になる二数の組み合わせを求めよ いくつかの n について,答の二数を求め,その二数にユークリッドの互除法を適用したときの二数の変化の様子を書…

フィボナッチ数列の各項下3桁のみからなる数列の一般項

a[0]=0a[1]=1a[i]=(a[i-1]+a[i-2]) mod 1000, i ≧ 2 素直に計算しても答は簡単に求まる。 しかし,各項は高々 3 桁なのだから,m 項が 0 で,m+1 項が 1 になることもあるだろうと...実際に調べれば,m = 1500 とわかる。つまり一般項 a[n] は,a[n] = a[n m…

コラッツの問題(2)

単純に,10 進数一桁を要素とするベクトルを使って,掛け算も,割り算も,自前でやるプログラムを書く。10 進数は,1 の位が添え字 1 になるように(逆順)にすると,プログラムが書きやすい。 途中経過をプリントするのを含めて,余裕の 24 行だ。 n = rep(…