正如唐罗比所说,你的问题有一个简单的旧算术解决方案。让我向您展示如何处理 i 的第一个值。
* 编辑 2:下部代码 *
for(int i=m ; i<= n+1 ; i+=m)//old computation
s+=(i-1)/2 ;
int a = (n+1)/m; // maximum value of i
int b = (a*(a+1))/2; //
int v = 0;
int p;
if(m % 2 == 0){
p = m/2;
v = b*p-a; // this term is always here
}
else{
p = (m - 1)/2;
int sum1 = ((a/2)*(a/2 +1))/2;
int sum2 = (((a-1)/2)*((a-1)/2 +1))/2;
v = b*p -a ;// this term is always here
v+= sum1 + a/2; //sum( 1 <= j <= a )(j-1), j pair
v+= sum2; //sum( 1 <= j <= a )(j-1), j impair
}
System.out.println( " Are both result equals ? "+ (s == v));
我怎么想出来的?我拿
for(i=m ; i<= n+1 ; i+=m)
s+=(i-1)/2 ;
我做出改变
for(j=1 ; j*m <= n-1 ; j++)
s+=(j*m-1)/2 ;
我摆姿势a=Math.floor(n+1/m)
。有3种情况:
m 是对,则循环的内部是s+= p*j
。结果是
b(a*(a+1))/2 -a
m 是 impair 并且迭代器 j 是 pair
m 为 impair 且迭代器 j 为 impair 当 m 为 impair 时,您可以编写m = 2p + 1
并且循环的内部变为
s+= p*j + (j-1)/2
p*j
与以前相同,现在您需要通过假设 j 始终为 pair 或 j 始终为 impair 并将两个值相加来打破除法。
您需要计算的下一个循环是
for(int i=a+1 ; i<= (2*n-1) ; i+=m)// a is (n+1)/m
s+=(2*n-i+1)/2;
这与
for(int i=1 ; i<= (2*n-1)-a ; i+=m)
s+= (2n-a)/2 - (i-1)/2;
这个循环类似于第一个循环,所以没有太多工作要做......确实这很乏味......