Algorithm 破解编码面试-打印方程的所有正整数解

Algorithm 破解编码面试-打印方程的所有正整数解,algorithm,Algorithm,在《破解密码》一书中 有一个例子: 打印方程式的所有正整数解 a^3+b^3=c^3+d^3 其中a、b、c和d是介于1和1000之间的整数 书中说“只有一个人能工作”,但我不明白 正如我所看到的,只要所有这些变量相等,它就会工作 例如: a = 1, b = 1, c = 1, d = 1 a = 2, b = 2, c = 2, d = 2 a = 3, b = 3, c = 3, d = 3 作为一种猜测(问题是关于什么的?);你说得很对,有很多明显的解决办法,比如 我们所要做的就是设

在《破解密码》一书中

有一个例子:

打印方程式的所有正整数解

a^3+b^3=c^3+d^3

其中
a
b
c
d
是介于
1
1000
之间的整数

书中说“只有一个人能工作”,但我不明白

正如我所看到的,只要所有这些变量相等,它就会工作

例如:

a = 1, b = 1, c = 1, d = 1
a = 2, b = 2, c = 2, d = 2
a = 3, b = 3, c = 3, d = 3
作为一种猜测(问题是关于什么的?);你说得很对,有很多明显的解决办法,比如

我们所要做的就是设置
a=c
b=d
a=d
b=c
。下面这些非平凡的解决方案呢

   1**3 +  12**3 =   9**3 +  10**3
  84**3 + 280**3 = 217**3 + 231**3
请注意,我们可以交换
a
b
或/和
c
d
,并提供类似的衍生解决方案

  12**3 + 1**3 = 10**3 + 9**3

为了排除它们,我们假设
a是的,您是对的,肯定有多种解决方案。你确定这些都是书中的要求吗?或者你的意思是“只有一个人能工作”
的上下文?我想你是在问《只有一个人能工作》一书中的一句话,但是没有上下文,很难做到这一点。显然,这并不意味着只有一个解决方案(或者这是非常错误的),因为有很多解决方案。我找到了这本书,你错过了在找到解决方案时打破
d
循环的上下文,因为只有
d
的一个值可以工作(对于给定的
a
b
c
).如果我们排除琐碎的解决方案,即如果我们需要
a!=c、 a=d、 b!=c、 b!=d
?对于d循环,似乎不需要在找到d值之前进行迭代。一个包含所有d^3解决方案的简单hashmap会更快(对照A^3+b^3-c^3进行检查)
  12**3 + 1**3 = 10**3 + 9**3
  Dictionary<long, List<(long, long)>> cubes = new Dictionary<long, List<(long, long)>>();

  for (long a = 1; a < 1000; ++a) {
    long a3 = a * a * a;

    for (long b = a; b < 1000; ++b) {
      long key = b * b * b + a3;

      if (cubes.TryGetValue(key, out var list))
        list.Add((a, b));
      else
        cubes.Add(key, new List<(long, long)>() { (a, b) });
    }
  }        
  {2, {(1, 1)}} // group with one (a, b) pair
  {9, {(1, 2)}} // another group with one (a, b) pair
   ...
  {1729, {(1, 12), (9, 10)}} // <- the group we are looking for!
   ...
var report = string.Join(Environment.NewLine, cubes
  .Where(pair => pair.Value.Count >= 2)
  .Select(pair => $"{string.Join(" = ", pair.Value.Select(t => $"{t.Item1}**3 + {t.Item2}**3"))}"));

Console.Write(report);
1**3 + 12**3 = 9**3 + 10**3
1**3 + 103**3 = 64**3 + 94**3
1**3 + 150**3 = 73**3 + 144**3
1**3 + 249**3 = 135**3 + 235**3
... 
22**3 + 986**3 = 180**3 + 984**3 = 692**3 + 856**3
...
802**3 + 987**3 = 883**3 + 924**3