Есть ли лучший способ (трюк с математикой / C ++) от Итерации до прямого и обратного хода в заданном диапазоне

С помощью модульная арифметика (или же) (%В операторе 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;
}

2

Решение

Вы можете использовать функцию абсолютного значения следующим образом:

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), а затем принимаете абсолютное значение.

РЕДАКТИРОВАТЬ: фиксированный код, чтобы начать с нуля вместо диапазона.

3

Другие решения

Я нашел другое решение, хотя оно без каких-либо хитростей. Вот как бы я справился с вашей задачей без абсолютной функции:

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: забыл изменить обратно на истину.

1

По вопросам рекламы [email protected]