找到与 C++ 中的公式匹配的最小整数

Find the lowest integer that matches equation in C++

本文关键字:整数 C++      更新时间:2023-10-16

可能的重复项:
寻找哈代拉马努金数

我需要找到最低的自然数x

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

(k, l, i, j)必须都不同。


我尝试了以下四个 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);

你需要重新构建你对问题的看法。

它实际上是在说:以两种不同方式表示为两个立方体之和的最小自然数是多少?

问题语句调用该数字 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浮点误差是否会使这复杂化很多。这就是这个问题的真正内容 - 玩得开心。

使代码正常工作的一种简单方法是限制变量的域,然后一次扩展一点。

正如 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
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);

像这样的东西尝试了没有 dups 的所有数字组合(最大值为 100),i <l。>

你的循环假设i<j<k<l,这不一定是真的。(可能是那个j>k。一旦你得到了正确的假设,你就可以对循环重新排序,这样第一项是最大的,所以其他循环是有限的。

下面是一个i>ji>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的立方根是否是自然数来消除第四个循环。然后尝试为k找到更明智的起始值。