Помощь - Поиск - Пользователи - Календарь
Полная версия: Казнь
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
EXE
Задача
На площадь выводят N человек, приговоренных к смерти, каждому из которым присвоен уникальный номер от 1 до N. Их расставляют по кругу по часовой стрелке по порядку. Казнь производится следующим образом: отсчитывают M человек, начиная с человека, стоящего после только что казненного, и этого M-го человека уводят на казнь. В начале казни отчет ведется от человека с номером 1. Узнать, человека с каким номером казнят K-м?

С клавиатуры вводятся числа: N, M, K

1<=N<=30000
1<=M<=30000
1<=K<=N


Я тут написал вроде, но не уверен. Посмотрите и подправьте если чего не так:
:low:
var
  n, m, k, dop_per: integer;

begin
  clrscr;
  TextColor(white);
  write('N: '); readln(n);
  write('M: '); readln(m);
  write('K: '); readln(k);
  dop_per:=m*k;
  repeat
    if dop_per>n then begin
      dop_per:=dop_per-n;
    end;
  until dop_per<=n;
  write(dop_per);
  readln;
end.
EXE
Ну, чего никто ничего не говорит? Жду. А то в понедельник показать надо
volvo
EXE
Подождать еще пару часов можешь? Заканчиваю отладку. Твоя версия работает неправильно...
EXE
volvo
черт, я не тот исходник выложил. Только щас заметил. Ну ладно подожду твоей версии
volvo
EXE
:nono: Нет уж, выкладывай свою... А потом сравнишь с моей.
volvo
EXE
Ясно, исходника у тебя никакого нет... Разбираться в приведенной программе будешь сам.
Код

Const
 n = 11;
 m = 7;
 k = 3;

Const
 liRange = SizeOf(LongInt) * 8;
Type
 TBigReg =
   Array[1 .. (n div liRange) + Byte((n mod liRange) > 0)] Of LongInt;

Procedure bit_info(bit: LongInt;
         Var block, offset: Byte);
 Begin
   block := Succ(Pred(bit) div 32);
   offset := Byte( ((bit mod 32) <> 0)) * 32 - (bit mod 32);
 end;

Function is_bit_set(Var x: TBigReg; bit: LongInt): Boolean;
 Var bBlck, bOffs: Byte;
 Begin
   bit_info(bit, bBlck, bOffs);
   is_bit_set := (((x[bBlck] shr bOffs) and $1) = $1);
 End;

Procedure xorBit(Var x: TBigReg; bit: LongInt);
 Var bBlck, bOffs: Byte;
 Begin
   bit_info(bit, bBlck, bOffs);
   x[bBlck] := x[bBlck] xor (LongInt($1) shl bOffs)
 End;

Procedure reset_bit(Var x: TBigReg; bit: LongInt);
 Begin
   If is_bit_set(x, bit) Then xorBit(x, bit)
 End;

Procedure set_bit(Var x: TBigReg; bit: LongInt);
 Begin
   If not is_bit_set(x, bit) Then xorBit(x, bit)
 End;

Function down_next(Var people: TBigReg;
        k, every: LongInt): LongInt;
 Var curr_bit, count, i: LongInt;

 Function next_bit(x: LongInt): LongInt;
   Begin
     Inc(x);
     If x > n Then x := 1;
     next_bit := x
   End;

 Begin
   curr_bit := 0;

   For i := 1 To k Do
     Begin
       count := 0;
       While count < every Do
         Begin
           curr_bit := next_bit(curr_bit);
           inc( count, Byte(is_bit_set(people, curr_bit)) )
         End;
       reset_bit(people, curr_bit)
     End;
   down_next := curr_bit;
 End;


Var
 all: TBigReg;
 i: integer;
begin
 For i := 1 To n Do
   set_bit(all, i);
 WriteLn('this was number: ', down_next(all, k, m))
end.
EXE
Вообще-то я в форуме не круглосуточно сижу! <_<
K Y S K A
Я сейчас на первом курсе и мне тоже задали эту задачку, но как её исправить, чтобы он считывал n m и k??? поскажите, а тоя попробывала а он мне пишет что так нельзя помогите пожалуйста!! !mol1.gif !mol1.gif
klem4
blink.gif mega_chok.gif

убераешь их из раздела CONST, добавляешь var n,m,k : integer; и вводишь в основном блоке программы ...
K Y S K A
А т ы попробуй и увидишь, что он пишет!!!!
klem4
Да .. придется перекроить прогу или использовать константы, потому что они используются в описании типов ... извиняюсь, не заметил сначала.
volvo
K Y S K A, а ты скажи, что он тебе пишет, почему кто-то должен пробовать... dry.gif Вот у меня например все нормально отрабатывает !!!

klem4, и ЭТО говоришь ты, модератор раздела ??? !!!
K Y S K A
" Cannot evalute this expresion" вот что он мне пишет, показывая на 10 строчку!
volvo
K Y S K A,
первые строки программы меняются вот так:
Const
 n: integer = 11;
 m: integer = 7;
 k: integer = 3;

Const
 liRange = SizeOf(LongInt) * 8;
Type
 TBigReg =
   Array[1 .. 100] Of LongInt;

А потом в основном блоке как хочешь так m, n, k и изменяй... Хочешь - с клавиатуры вводи, хочешь просто переприсваивай... blum.gif
klem4
хм Volvo... а как интересно компилятор пойемт вот это :
TBigReg =
   Array[1 .. (n div liRange) + Byte((n mod liRange) > 0)] Of LongInt;


если перед этой строчкой я сотру раздел констант в котором присутствует n=11 ? blink.gif Ну если я не прав ... извиняюсь.

так что правда тут за мной blum.gif

аа ну вот и решилась проблема ... good.gif
virt
onst
 n_max = 11;
 m_max = 7;
 k_max = 3;

Const
 liRange = SizeOf(LongInt) * 8;
Type
 TBigReg =
   Array[1 .. (n_max div liRange) + Byte((n_max mod liRange) > 0)] Of LongInt;
var n,m,k : integer;

.......................

read(n,m,k);

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.