3

重複の可能性:
Hardy Ramanujan Numbers の検索

最小の自然数を見つける必要がありますx

x = k^3 + l^3 = i^3 + j^3 

そして、(k, l, i, j)すべて異なっている必要があります。


次の 4 つの for ループを試しましたが、変数が無限に増えてしまい、正しい解にたどり着けませんでした...

for (int i=0;;i++)
    for (int j=i+1;;j++)
        for (int k=j+1;;k++)
            for (int l=k+1;;i++)
                compare(i,j,k,l);
4

4 に答える 4

4

問題についてどのように考えているかを再構成する必要があります。

2 つの異なる方法で 2 つの立方体の和として表現できる最小の自然数は何ですか?

問題文はその数 x を呼び出し、立方体のペアは (i, j) と (k, l) です。

このように言い換えると、それほど悪くはありません。疑似コードのヒントは次のとおりです。

function count_num_cubic_pairs(n):
    cubic_pairs = []
    for i..n:
        first_cube = i * i * i
        remainder = n - first_cube
        if remainder is a cube and (first_cube, remainder) not in cubic_pairs:
            cubic_pairs.add((first_cube, remainder))
    return length(cubic_pairs)

remainder is a cube困難な部分は、浮動小数点エラーが非常に複雑になるかどうかをテストすることです。それがこの問題の本質です - 楽しんでください。

于 2012-11-19T20:25:06.830 に答える
1

コードを機能させる簡単な方法の 1 つは、変数のドメインを制限してから、少しずつ拡張することです。

mazayus が述べたように、各変数を以前のものよりも厳密に大きく維持しているため、正しい可能性のあるバリエーションは決してありません。

このようなもの (疑似コード) は機能する可能性がありますが、恐ろしく非効率的です。

for max in [100, 200, 300, ...]
  for i in [0..max]
    for j in [0..max]
      for k in [0..max]
        for l in [0..max]
          if (i equals k or l, or j equals k or l) continue
          if (i^3 + j^3 equals k^3 + l^3)
            return answer
于 2012-11-19T20:22:56.057 に答える
1
int i = 1
int j = 3
int k = 2
int l = 4

do {
  do {
    do {
      do {
        compare(i, j ,k l);
        i++;
      } while (i < k);
      k++;
    } while (k < j);
    j++;
  } while(j < l);
  l++;
} while(l < 100);

このようなものは、i < k < j < l で、重複なし (最大 100 の値) の数値のすべての組み合わせを試行します。

于 2012-11-19T20:24:40.233 に答える
1

あなたのループは を想定していますがi<j<k<l、これは必ずしも真実ではありません。(そうかもしれませんj>k。) 正しい仮定が得られたら、ループの順序を変更して、最初の項目が最大になり、他のループが制限されるようにすることができます。

i>j, i>k>l,を使用した例を次に示します。

for (int i=1;;i++)
    for (int j=1;j<i;j++)
        for (int k=1;k<i;k++)
            for (int l=1;l<k;i++)
                compare(i,j,k,l);

それが機能するようになったら、の立方根i*i*i+j*j*j-k*k*kが自然数であるかどうかを確認して、4 番目のループを排除してみてください。次に、 のよりスマートな開始値を見つけてみてくださいk

于 2012-11-19T23:51:06.580 に答える