Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2010, 13:39   #1
Знаменок
Новичок
Джуниор
 
Регистрация: 05.10.2010
Сообщений: 5
По умолчанию Сдвиги Pascal (ТРУДНАЯ ЗАДАЧА)

Ограничение по времени: 1 секунда
Ограничение по памяти: 64 Мб
Максим работает в лаборатории чисел. Ученые этой лаборатории проводят важный опыт над числами. Дано число в десятичной системе счисления. Его переводят в двоичную и записывают на листок как последовательность единиц и нулей. Затем над этой последовательностью производят циклический сдвиг - каждую цифру перемещают на одну вправо, а последнюю на первое место. С новой последовательностью проводят ту же операцию, и всё это продолжается до тех пор пока не получается исходная последовательность. Все последовательности на листке снова преобразуют в числа и переводят в десятичную систему. Все эти числа называют "аналогами" подопытного числа. Среди них находят максимальное и называют его "старшим аналогом". "старший аналог" числа может соответствовать самому числу. (например для числа 12 аналогами будут являться числа 9,3, 5, 12, максимальное из них - 12). Максим пишет программу, которая по числу определяет его старшего аналога. можете ли вы ему помочь?
ФОрмат входных данных
На вход программе подаётся натуральное число N(1<=N<=2 в 15 степени) (<= - меньше либо равно) - подопытное число
Формат выходных данных:
Выведите старший аналог числа
Знаменок вне форума Ответить с цитированием
Старый 05.10.2010, 15:33   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Вам как
1. дать подсказку (в двоичной математике)
2. расписать алгоритм
3 или сразу написать программу.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 05.10.2010, 16:12   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

извините, что влезаю в тему со своим вопросами...

народ, а кто понял, расскажите мне, пожалуйста,
что такое "до тех пор пока не получается исходная последовательность" ?!

ну, вот, взяли (как в примере в самой задаче число 12):
0000000000001100
сдигаем, получаем 6
0000000000000110
потом ....
0000000000000011
1000000000000001
1100000000000000
0110000000000000
0011000000000000
0001100000000000
0000110000000000
0000011000000000
0000011000000000
0000001100000000
0000000110000000
0000000011000000
0000000001100000
0000000000110000
0000000000011000
0000000000001100

И где в этой последовательности 5 и 9 ?!?!

или я торможу, или одно из двух...

поясните, пожалуйста...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.10.2010, 17:12   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
каждую цифру перемещают на одну вправо, а последнюю на первое место.
незначащие нули в исходном числе отбрасываютя

1100 = 12
0110 = 6
0011 = 3
1001 = 9
1100 = 12

P.S. алгоритм решения прост и примитивен но требует умения мыслить в двоичной математике. Используются свойства и правила сравнения двоичных чисел.сравнения Впрочем в обычной арифметике действую те же правила. Но в двоичной все гораздо проще потому что только ДВЕ цифры. Подождем ответа на первый пост. Но сразу оговорюсь, писать всю программу не буду. Могу ответить только первые 2 варианта.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 05.10.2010 в 17:24.
evg_m вне форума Ответить с цитированием
Старый 05.10.2010, 17:38   #5
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

так а где же число 5??? или он просто ошибся.
Да, и ограничение по памяти наверное не Mб, а Кб.
ICQ: 593-013-807

Последний раз редактировалось Don Karleone; 05.10.2010 в 17:41.
Don Karleone вне форума Ответить с цитированием
Старый 05.10.2010, 20:00   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

всё понятно.
Коллеги, спасибо за ответ.

1) число 5 лишнее, его там быть не может

2) описание задачи + решение - тут - Забавная игра (Программирование на Паскале)

думаю, что максимальное число сдвигов (при N<=2 в 15 степени) будет всего 16 сдвигов. Думаю, что секунды хватит даже при решении задачи "в лоб"...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.10.2010, 21:32   #7
Знаменок
Новичок
Джуниор
 
Регистрация: 05.10.2010
Сообщений: 5
По умолчанию

напишите программу плиз
Знаменок вне форума Ответить с цитированием
Старый 06.10.2010, 13:53   #8
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Ограничение по памяти: 64 Мб

Нифига себе...Какие щедрые преподы(ну или учебники) на память...Это ж как в паскале можно столько потратить памяти?Я 65Кб и то с трудом могу потратить....
_-Re@l-_ вне форума Ответить с цитированием
Старый 06.10.2010, 14:06   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
(например для числа 12 аналогами будут являться числа 9,3, 5, 12, максимальное из них - 12)
Судя по тому что я понял программа Мак Сима должна выглядеть так:
Код:
  var k,i,e,mx:word;
begin
 i:=12;    e:=i;
 repeat
  asm
   mov ax,[i]
   ror ax,1
   mov [i],ax
  end;
  write(i:10);
  if mx<i then mx:=i;
 until i=e;
 writeln;
  write(mx:10);
 readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
Но Страннику, давшему задание Маку нуна уши поотрывать, за такие странности.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.10.2010, 14:47   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
напишите программу плиз
ну, так и быть.... Ваше счастье, что задачка более-менее интересная...

Код:
var N, K, Max, Mask : word;

begin
  Readln(N);

  if N=0 then begin
    WriteLn('Максимальный аналог равен НУЛЮ!');
    Halt(1);
  end;

  K := N;
  while K>0 do begin
    Mask := Mask shl 1 or $1;
    K := K shr 1;
  end;

  K := N;
  Max := N;
  if Mask = $FFFF then begin
    repeat
      if (K and $8000) = $8000 then K := (K shl 1) or $1
      else K := K shl 1;
      if K>Max then Max := K;
    until K=N;
  end
  else begin
    repeat
      K := K shl 1;
      if (K and Not Mask)<>0 then K := (K and Mask) or $1;
      if K>Max then Max := K;
    until K=N;
  end;


  WriteLn('Для ',N:1,' максимальный аналог = ',Max:1);


end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как реализовать в турбо паскале побитовые сдвиги. Moneo Помощь студентам 1 26.02.2010 11:21
Delphi. Консоль. Массивы. Сдвиги в них. Saka Помощь студентам 2 10.12.2009 20:25
использовать оператор цикла, сдвиги и инкремент Еля Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 16.11.2009 15:04
Трудная прога на Паскале HECTOR.A. Помощь студентам 3 18.12.2008 08:54
Сдвиги и циклы ...вроде Magnit Паскаль, Turbo Pascal, PascalABC.NET 1 01.06.2007 01:01