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 等

问题:

在类似的意义上,我们可以使用任何算术关系/C++技巧来在一定范围内向前移动增加的数字(直到上限)和反向移动(直到下限或0)的数字。

例如:

如果范围 = 5 那么

0 1 2 3 4 3 2 1 0 1 2 3 4 3 2 1 0 .....0 1 2 3 等

在下面的程序中,我使用了两种方法在给定范围内向前/向后迭代。

但我很感兴趣-有没有最好的方法(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
}

基本上,你将范围加倍,减去范围的一半(所以它从 -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:忘记将反向更改为真。

于 2014-07-08T14:07:26.517 回答