【发布时间】:2019-06-27 17:16:04
【问题描述】:
我正在执行一个简单的程序,该程序接受一个数字并查找与给定数字匹配的连续数字的出现次数。
例如:
if input is 15, then the consecutive numbers that sum upto 15 are:
1,2,3,4,5
4,5,6
7,8
So the answer is 3 as we have 3 possibilities here.
当我在寻找解决方案时,我发现了以下答案:
static long process(long input) {
long count = 0;
for (long j = 2; j < input/ 2; j++) {
long temp = (j * (j + 1)) / 2;
if (temp > input) {
break;
}
if ((input- temp) % j == 0) {
count++;
}
}
return count;
}
我无法理解这是如何解决要求的,因为该程序使用了一些我无法正确理解的公式,以下是我的疑问:
- for循环从2开始,这是什么原因?
-
long temp = (j * (j + 1)) / 2;这个逻辑说明了什么?这对解决问题有什么帮助? -
if ((num - temp) % j == 0)还有这说明什么?
请帮助我理解这个解决方案。
【问题讨论】:
-
@JoeC,我也试过调试,但是这个程序是用一些公式来解决问题的,我无法理解这个公式的含义
-
您是否尝试过手写操作?对于给定的小输入,尝试按照算法手动计算。这可能会有所启发。
-
@Rietty 我已经这样做了,但是程序的复杂性不好,所以在搜索时我发现了这个高效的程序
-
是的,我是说,把你亲手找到的算法写出来。例如.. 以
count = 0, input = 15, j = 2.开头,因此temp = (2 * (2 + 1)) / 2 = 3和3 is not > 15,所以你这样做:(15 - 3) / 2并且因为它不等于0,所以将1添加到计数中。现在用j = 3重复一遍,以此类推,直到j = 15/2,然后看看你还剩下什么。 -
@Rietty,问题是我们为什么需要做
temp = (2 * (2 + 1)) / 2 = 3以及这如何有助于解决问题。我可以理解程序在做什么,但我想知道这些步骤如何解决问题陈述。
标签: java algorithm for-loop if-statement math