我正在尝试解决此页面的问题,结果如下:
public static int metodo() {
int total = 0;
for (int i=1; i<1000; ++i) {
if (i%3 == 0 || i%5 == 0) { total += i; }
};
return total;
}
但我试图不使用余数运算符,并以某种方式通过乘以 5 或 3 来获得倍数,但每次我不尝试它时,它都没有给我预期的结果,有没有办法做它通过乘法?
一种可能性:
解释:我们首先将 3 的所有倍数相加,然后将 5 的倍数相加。然后我们减去两者的倍数(因此是 15 的倍数),以纠正我们之前两次相加的事实。
在某种程度上,这更像是一个数学问题而不是编程问题。
首先,我们要计算小于 X 的除数 D 的倍数的总和。我们计算小于 X 的 D 的最大倍数,我们称之为 M(X,D):M(X,D ) = ( ( X-1) integer_division D ) * D
在除数 3 的情况下:M(1000,3) = 999
我们计算总和: 3 + 6 + ... + 996 + 999 ;我们称之为 S(X,D)
这是一个算术级数,其总和由下式给出:
在哪里 :
在java中我们这样计算:
最终结果是小于X的3和5的倍数之和,即:S(1000.3)+S(1000.5)
但是有一个问题,上面我们把15的倍数加了两次,为了补偿我们减了一次:Final result = S(1000.3)+S(1000.5)-S(1000.15)
在java中这是:
这种形式需要恒定的执行时间,而对于循环,时间随着 X 的增加而增加。
如果你单独进行比较会更容易,我也解决了这些问题,这段代码给了我正确的结果。