@th0m4sXD

По какой формуле можно получить круговую последовательность чисел?

Извините за школьный вопрос) Какая функция даёт нам круговую последовательность чисел, доспустим, у меня есть текущий индекс и мне нужно получить на 1 меньший, но если текущий индес 0, то нужно получить максимальный индекс.
UPD: Без if или тернарных операторов, просто математическая функция.
  • Вопрос задан
  • 239 просмотров
Решения вопроса 1
longclaps
@longclaps
Это - деление по модулю, но есть нюанс:
В разных языках оно реализовано по-разному, т.е. это не вполне "математическая функция".
Вот питон
MOD = 3

def f(x):
    return (x - 1) % MOD

for x in range(MOD):
    print(f'f({x}) = {f(x)}')

А в javascript'е уже надо ловчить
const MOD = 3;
const f = x => (x + MOD - 1) % MOD;
for (let x = 0; x < MOD; x++)
    console.log(`f(${x}) = ${f(x)}`);

Причем в питоне javascript'овый вариант работать будет )
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
PavelK
@PavelK
int cur = 5;
int max = 10;
cur = ( cur-1 <= 0 )? max : cur-1;

Это что ли?

UPDT1: Ну тогда вот так (первое, что в голову пришло, может можно проще - лень думать):
int cur = 5;
int max = 10;
cur = max-cur/cur*(max+1)+cur;

Но, имхо, через if будет быстрее :DD
Ответ написан
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
Возможно вы имели ввиду остаток от деления

#include <iostream>

int main() {
	const size_t SIZE = 10;
	int array[SIZE];
	for (size_t i = 0; i < SIZE; ++i)
		array[i] = i;
		
	for (size_t i = 0; i < SIZE * 5; ++i)
		std::cout << array[i % SIZE] << std::endl;
	std::cout << std::endl;
	for (int i = SIZE; i > -10; --i)
		std::cout << array[i % SIZE] << std::endl;
	
	return 0;
}
Ответ написан
Griboks
@Griboks
Это называется делением по модулю (x mod y). Например, возьмём деление по модулю 2:
0->0
1->1
2->0
3->1
-1->1
-2->0
-3->1
Вам же необходимо использовать деление по модулю длины массива.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы