Показать сообщение отдельно
  #6  
Старый 01.03.2012, 20:32
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Это самое "очевидное" решение. Программируется "в лоб" - вычисляешь номер, удаляешь, вычисляешь, удаляешь,...
Но представь. Злобный пользователь ввел в программу число человек ~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];
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием