Это самое "очевидное" решение. Программируется "в лоб" - вычисляешь номер, удаляешь, вычисляешь, удаляешь,...
Но представь. Злобный пользователь ввел в программу число человек ~100 000, а число счетов - порядка 10 000 000. Сколько минут/часов будет работать такая программа?...
Но, если покопать математику, можно понять, что человек, на которого попадет счет, всегда будет иметь номер
(m-1) mod n, т.е. остаток от деления кол-ва счетов (-1) на общее число человек, отсчитывая от предыдущего выбитого.
Можно составить массив, где будут записаны подряд номера от 1 до n, и в цикле удалять человека с номером Num (вычисляется далее; сдвигать массив на одну позицию, затирая выбранный номер) и уменьшать n, после чего следующий номер будет как Num = (m-1+Num) mod n.
То есть алгоритм:
1) Зануляем Num.
2) В цикле for от 1 до n-1 (количество повторов) делаем следующее:
2.1) Num := (m-1+Num) mod n;
2.2) Сдвигаем массив, начиная с элемента с индексом Num.
2.3) Уменьшаем n на 1.
Массив должен быть пронумерован с нуля.
Вроде ничего не упустил.
ПыСы: не люблю за людей писать код, потому что переводить алгоритмы в код надо самим... Но так и быть, удаление:
Код:
dec(n);
for i:=Num to n-1 do // Массив нумеруется с нуля! Т.е. array[0..Max-1]
a[i]:=a[i+1];