- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个问题要解决。 N
自然数给定。我需要找到一个自然数列表,这些自然数求和为给定数,同时求和为 1。
a + b + c + ... = N
1/a + 1/b + 1/c + ... = 1
a
、b
、c
不必是唯一的。
我用 Java 编写了以下代码。它适用于简单的情况,但对于 N > 1000
来说已经非常慢了。
我如何重写该方法,使其即使对数百万也能快速运行?也许,我应该放弃递归或用我错过的数学技巧切断一些分支?
上海商会:
private final static double ONE = 1.00000001;
public List<Integer> search (int number) {
int bound = (int)Math.sqrt(number) + 1;
List<Integer> list = new ArrayList<Integer>(bound);
if (number == 1) {
list.add(1);
return list;
}
for (int i = 2; i <= bound; i++) {
list.clear();
if (simulate(number, i, list, 0.0)) break;
}
return list;
}
//TODO: how to reuse already calculated results?
private boolean search (int number, int n, List<Integer> list, double sum) {
if (sum > ONE) {
return false;
}
//would be larger anyway
double minSum = sum + 1.0 / number;
if (minSum > ONE) {
return false;
}
if (n == 1) {
if (minSum < 0.99999999) {
return false;
}
list.add(number);
return true;
}
boolean success = false;
for (int i = 2; i < number; i++) {
if (number - i > 0) {
double tmpSum = sum + 1.0 / i;
if (tmpSum > ONE) continue;
list.add(i);
success = search(number - i, n - 1, list, tmpSum);
if (!success) {
list.remove(list.size() - 1);
}
if (success) break;
}
}
return success;
}
最佳答案
论文"A Theorem on Partitions", 1963 by Graham, R. L.表明对于 N > 77 存在一个解决方案,其中使用的数字是本能的,并提出了一种算法来找到这样的分解。
算法如下:
(N-179)/2
的分解 d1, d2, d3, d4, ..., dk
,然后 3, 7, 78, 91, 2*d1, 2*d2, 2*d3, ..., 2*dk
是 N 的分解(N-2)/2
的分解 d1, d2, d3, d4, ..., dk
,然后 2, 2*d1, 2*d2, 2*d3, ..., 2*dk
是 N 的分解但由于您不关心分解中有不同的数字,您可以将预计算结果表的大小减少到 60,如果 N 是奇数,找到分解 d1, d2, d3, d4, ..., dk
为 (N-9)/2
,然后是 3, 6, 2*d1, 2*d2, 2*d3, ... , 2*dk
是 N 的分解。
关于java - 总和为 N 且逆数总和为 1 的所有自然数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16588372/
我不知道引用引用的对象的值如何。顺便说一句,我不是在谈论整数。 我想做这个方法。 swapNN(NaturalNumber j, NaturalNumber n) 我希望交换 j 和 n 的引用,但是
给定一个向量 v w [1] -2 -1 0 1 2 3 4 7 8 9 10 11 12 13 19 20 21 22 23 24 25 最佳答案 另一种方法是 c(t(sapp
给定前 n 个自然数的 k 组合,出于某种原因,我需要在 itertools 返回的那些组合中找到这种组合的位置。 combination(range(1,n),k)(原因是这样我可以使用 list
在根据代码摘录识别复杂性或最坏情况时,我了解什么是大 O 表示法。 在类里面,我被教导说,当谈到复杂性和大 O 表示法时,我们忽略低于 M 的小参数 n 和常数因子 C 。 这是在类里面给我的: In
我需要编写一个算法来解决这个练习,有什么建议吗? 练习: 我们有一个矩形,分成 n x m 个正方形,每个正方形都是自然数。编写一个函数来计算这个矩形内有多少个幻方。 幻方是 k x k (k>=2)
我是一名优秀的程序员,十分优秀!