ドン・ロベイが言ったように、あなたの問題には昔ながらの算術的解決策があります。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は障害であり、イテレータjはペアです
mが損なわれ、イテレータjが損なわれるmが損なわれると、次のように記述できm = 2p + 1
、ループの内部は次のようになります。
s+= p*j + (j-1)/2
p*j
は以前と同じですが、jが常にペアであるか、jが常に損なわれていると仮定し、両方の値を合計することによって、除算を破る必要があります。
計算する必要がある次のループは
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;
このループは最初のループに似ているので、やるべきことはあまりありません...確かにこれは退屈です。