Использование модуля в для цикла - PullRequest
1 голос
/ 22 сентября 2011

Я пытаюсь понять, как повторять циклы, используя оператор мод.

Если у вас есть две строки, "abc" и "defgh", как можно использовать % для циклического прохождения по abc, повторяя его до конца defgh? А именно, каково соотношение мод длины abc и defgh?

Я не очень понимаю эту концепцию.

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

Типичное использование mod для генерации значений в фиксированном диапазоне. В этом случае вам нужны значения от 0 до strlen("abc")-1, чтобы вы не могли получить доступ к позиции за пределами "abc".

Общая концепция, которую вам нужно иметь в виду, заключается в том, что x % N всегда будет возвращать значение от 0 до N-1. В данном конкретном случае мы также пользуемся тем фактом, что если вы увеличиваете x на 1 x % N, то также увеличивается на 1. Видите?

Другим важным свойством модуля, который мы здесь используем, является тот факт, что он «переворачивается». Когда вы увеличиваете x на 1, x % N увеличивается на 1. Когда оно достигает N-1, следующее значение будет 0 и т. Д.

Посмотрите на код @ Дэниела. Это C ++, но концепция не зависит от языка

2 голосов
/ 22 сентября 2011

Простой.

std::string abc("abc");
std::string defgh("defgh");

for (size_t i = 0; i < defgh.length(); ++i)
{
    printf("%c", abc[i % abc.length()]);
}

Подумайте о том, что делает оператор модуля, он дискретно делит левую часть на правую и выплевывает целочисленный остаток.

Пример:

0 % 3 == 0
1 % 3 == 1
2 % 3 == 2
3 % 3 == 0
4 % 3 == 1

В нашем случае левая сторона представляет i-ю позицию в «defgh», правая рука представляет длину «abc», и в результате индекс цикла внутри «abc».

...