2

C++ で剰余算術(または) ( % ) 演算子を使用すると、範囲を指定して連続する数値を循環できます。

例えば:

範囲が 5 (または) モジュロ 5 の場合は、次のように循環できます。

0 1 2 3 4 0 (5) 1(6) 2(7) 3(8) 4(9) 0(10)........0 1 2 3 など

質問:

同様の意味で、範囲を指定して増加する数値を前方に移動し(上限まで)、減少する数値を逆方向に移動する(下限または0まで)ために使用できる算術関係/ C++トリックがあります。

例えば:

範囲 = 5 の場合

0 1 2 3 4 3 2 1 0 1 2 3 4 3 2 1 0...................... 0 1 2 3 など

以下のプログラムでは、特定の範囲内で順方向/逆方向を繰り返すために 2 つのアプローチを使用しました。

しかし、私は興味があります-特定の範囲内で順方向と逆方向を反復する最良の方法(C++トリック/数学関係)はありますか?.

#include<iostream>
int main() {
    int range = 5;

    // 0 1 2 3 4 0 1 2 3 4 .....(Cycle through in the range 0 - 4)
    int i = 0;
    while(true) {
        // 0 1 2 3 4 0 1 2 3 4 .....(cycle through in the range 0 - 4)
        std::cout<< i; 
        i = (i+1)% range; // Modulo
        // some break condition
    }

    // 0 1 2 3 4 3 2 1 0 .......... (Forward and Reverse in the range 0 - 4)
    // Method 1:
    int j = 0;
    bool reverse = false;
    while(true) {
        if(reverse == false) {
            if(j < range) {
                std::cout << j;
                j = j+1;
            }
            else {
                reverse = true;
                j = j-1;
            }
        }
        else {
            j = j-1;
            std::cout << j;
            if(j == 0) {
                reverse = false;
                j = j + 1;
            }
        }
        // some break condition
    }

    // 0 1 2 3 4 3 2 1 0 .......... (Forward and Reverse in the range 0 - 4)
    // Method 2: 
    // Using modulo (if the range is big value then this is not good approach)
    int limit[8] = {0,1,2,3,4,3,2,1};
    int k = 0;
    while(true) {
        std::cout<< limit[k];
        k = (k+1)%8;
        // some break condition
    }
    return 0;
}
4

2 に答える 2

3

次のように絶対値関数を使用できます。

int i = range;
int a = range;
while(true) {
// 0 1 2 3 4 3 2 1 0 .......... (Forward and Reverse in the range 0 - 4)
    a = abs(i-range);
    std::cout<< a; 
    i = (i+1)%(range*2); // Modulo
}

基本的には、範囲を 2 倍にし、範囲の半分を引いて (つまり、-range から +range になる)、絶対値を取ります。

編集: 範囲ではなくゼロから開始するようにコードを修正しました。

于 2014-07-08T13:36:02.593 に答える
1

トリックはありませんが、別の解決策を見つけました。これは、絶対機能なしで、私があなたの問題を解決した方法です:

range = 7; //can be whatever

reverse = false;

for(i = 0; i < 1000; i++){
  if(i%range != 0){
    if(!reverse){
      std::cout<< i % range;
    }else{
      std::cout<< range - (i % range);
    }
  }
  else{
    if((i/range)%2 == 1){
      reverse = true;
      std::cout<< range;
    }else{
      std::cout<< i % range;
      reverse = false;
    }
  }
}

これにより、出力 01234567654321012345676543210 ... が提供されます。

これを行うのにしばらく時間がかかりました。あなたが本当に望んでいたものではないことはわかっていますが、共有したいと思いました。

乾杯。

編集:絶対の方が簡単ですが、条件の量を変更できるため、独自のコードを作成する方が良い場合があります。私のコードがより効率的であるとは思えませんが、あなたにはわかりません!

Edit2: reverse を true に変更するのを忘れました。

于 2014-07-08T14:07:26.517 に答える