2012-03-26 4 views
2

を崩壊しましたか?ベター私は、次のループしているループインデックス計算

ループを展開すると、でなく、オプションです。

+0

'ni'と' nj'は完全に任意ですか? –

+3

なぜ、倒れたループですか?なぜ入れ子になっていないのですか?それはあなたがそれが遅くなるようにテストしましたか? –

+0

@ R.MartinhoFernandesはい、小さいですが、100以下です – Anycorn

答えて

0

単純な変数は

すなわち

int end = ni*nj; 

forループ内でそれを使用する役に立つかもしれません。

+0

オーバヘッドはこれまでのところ整数分割である – Anycorn

+0

ループのたびに計算が実行されるという単なるコメントです。一度やり直すほうがいい。 –

5

私は2つの変数を使用します。 beginで除算とモジュロを使用し、stepの大きさによってはstepにする必要があります。 がループに入る前にループ内に入る必要はありません。 stepはより少ないとniの除数、次は トリックを行う必要がある場合:

int end = ni; 
int i = begin % ni; 
int firstJ = begin/ni; 
int j = firstJ; 
while (i < ni) { 
    // ... 
    j += step; 
    if (j >= nj) { 
     ++ i; 
     j = firstJ; 
    } 
} 

stepnj - firstJの倍数でない場合は、あなたがたときに、残りの取り扱いについて 何かをする必要がありますj >= nj

ijは、データにインデックスを付けるために使用されます。 データ構造の仕方によっては、beginに を追加する(ポインタがある場合)か、または各アクセス時にbegin, を追加して無視する方が簡単です。 (あなたがこれを行う場合は、それに応じて ninjを修正することを忘れないでください。)

0

あなたはあなたは私にあなたがそのあなたのためので、やっているのと同じ方法で計算することができます。この後

int k=0, j; 
int temp = 1; 
int result = 1; 
do{ 
    k++; 
    result = ni*k; 
} 
while(ni*k < ij); 
j = result; 

を次の操作を行うことができますdiv/modを使用していません。

関連する問題