Использование отрицательных аргументов с оператором %
нормально. Проблема в том, что вы смешиваете целые типы: nextIdx
- это целое число, а array.size()
возвращает целое число без знака. Итак, ваша проблема может быть сведена к этой строке кода:
std::cout << -1 % 6u << std::endl; // returns 3
Здесь операция %
преобразует тип левой части в тип правой части. сторона, поэтому ваш -1 становится беззнаковым, и это мешает вашей логической модульной операции.
Вы можете решить эту проблему, изменив свою функцию следующим образом:
int nextIdx = (currentIdx + jump) % (int) array.size();
(не запрашивается) ОБЗОР КОДА :
Было бы еще лучше, если бы вы могли организовать свои функции для выполнения таких преобразований типов за вас, определив их входные данные соответствующим образом. Также давайте продезинфицируем входы.
Примерно так:
#include <cassert>
#include <iostream>
#include <vector>
int64_t PostiveModular (int64_t n, int64_t m)
{
assert(m > 0);
return n % m + (n < 0) * m;
}
uint64_t NextIndex (uint64_t i, const std::vector<int> & vec)
{
assert(i < vec.size());
return PostiveModular(i + vec[i], vec.size());
}