2 つの数の立方(3乗)の和として表す表し方が 2 通りある 4 桁の自然数を求めよ。
素直にプログラムしても,計算時間は無視できるほど。
mx = floor(9999^(1/3)) # 1 から 21 までの 3 乗を調べればよい
res = integer(mx^3+(mx)^3) # 2 数の 3 乗和をメモするためのベクトル
for (i in 1:(mx-1)) {
for (j in (i+1):mx) {
num = i^3+j^3 # 2 数 i, j の 3 乗和
res[num] = res[num]+1 # 表し方のカウントを増やす
if (res[num] == 2) cat(num, "\n") # 2 通り目だったら,それが解
}
}
結果は
1729
4104
for などを使わずに,既存の関数などを使って解を求める。
x = (1:9999^(1/3))^3 # 1 〜 21 の 3 乗を要素とするベクトル
result = outer(x, x, "+") # 外積(和)を求める
result = result[upper.tri(result)] # 対称行列なので,上側三角行列(対角を除く)の要素を取り出す
tbl = table(result) # 度数分布を調べる
print(tbl[tbl == 2]) # 度数が 2 のものを書き出す
print 関数で書き出すと答えは
result
1729 4104
2 2
のようになる。cat ではだめ。
後者のプログラムは前者のものより 2 倍以上速い。