Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Казнь

Автор: EXE 17.12.2004 4:55

Задача
На площадь выводят 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 18.12.2004 17:24

Ну, чего никто ничего не говорит? Жду. А то в понедельник показать надо

Автор: volvo 18.12.2004 17:59

EXE
Подождать еще пару часов можешь? Заканчиваю отладку. Твоя версия работает неправильно...

Автор: EXE 18.12.2004 18:28

volvo
черт, я не тот исходник выложил. Только щас заметил. Ну ладно подожду твоей версии

Автор: volvo 18.12.2004 18:35

EXE
:nono: Нет уж, выкладывай свою... А потом сравнишь с моей.

Автор: volvo 18.12.2004 21:55

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 19.12.2004 1:42

Вообще-то я в форуме не круглосуточно сижу! <_<

Автор: K Y S K A 25.11.2005 17:53

Я сейчас на первом курсе и мне тоже задали эту задачку, но как её исправить, чтобы он считывал n m и k??? поскажите, а тоя попробывала а он мне пишет что так нельзя помогите пожалуйста!! !mol1.gif !mol1.gif

Автор: klem4 25.11.2005 21:04

blink.gif mega_chok.gif

убераешь их из раздела CONST, добавляешь var n,m,k : integer; и вводишь в основном блоке программы ...

Автор: K Y S K A 25.11.2005 22:23

А т ы попробуй и увидишь, что он пишет!!!!

Автор: klem4 25.11.2005 22:27

Да .. придется перекроить прогу или использовать константы, потому что они используются в описании типов ... извиняюсь, не заметил сначала.

Автор: volvo 25.11.2005 22:28

K Y S K A, а ты скажи, что он тебе пишет, почему кто-то должен пробовать... dry.gif Вот у меня например все нормально отрабатывает !!!

klem4, и ЭТО говоришь ты, модератор раздела ??? !!!

Автор: K Y S K A 25.11.2005 22:44

" Cannot evalute this expresion" вот что он мне пишет, показывая на 10 строчку!

Автор: volvo 25.11.2005 22:50

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 25.11.2005 22:51

хм Volvo... а как интересно компилятор пойемт вот это :

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


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

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

аа ну вот и решилась проблема ... good.gif

Автор: virt 25.11.2005 22:52

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);