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