Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi] задачка по шифровке!


Автор: Venom88 4.5.2008, 21:41
помогите решить.....
Двузначные номера. Каждую букву исходного сообщения заменили её порядковым двузначным номером в русском алфавите согласно таблице:
а    б    в    г    д    е    ё    ж    з    и    й 
01 02 03  04  05  06  07  08  09  10  11
к   л    м   н   о    п     р    с    т    у    ф
12  13  14 15 16 17   18   19 20  21  22
 х   ч    ц   ш  щ  ъ    ы    ь    э    ю   я
23  24  25 26 27 28  29  30   31  32  33
Полученную цифровую последовательность разбили (справа налево) на трехзн. Цифровые группы без пересечений и пропусков. Затем каждое из полученных трехзначных чисел умножили на 77 и оставили только три последние цифры произведения. В результате получилось последовательность цифр: 317564404970017677550547850355.  

Автор: Venom88 4.5.2008, 22:40
надо расшифровать и зашифровать.....я вроде это написал, присвоил каждой букве алфавита ее порядковый номер!! но вроде получилась одна фигня....может кто поможет решить(объеснить) эту задачку....

Автор: mmvds 4.5.2008, 22:49
1) Разбиваем исходную последовательность на трехзначные числа
2) Для каждого из них перебором находим такие две первых цифры (от 00 до 99) чтоб полученное число делилось без остатка на 77
3) Делим полученные числа на 77
4) Приводим частные к трехзначной длинне и соединяем в одну последовательность
5) Разбиваем полученную последовательность по две цифры
6) Подставляем согласно алфавиту каждому номеру буквы

Начни делать, потом скажешь на каком этапе помочь.

Автор: Beltar 5.5.2008, 09:03
Цитата

2) Для каждого из них перебором находим такие две первых цифры (от 00 до 99) чтоб полученное число делилось без остатка на 77


Зачем? Составить просто таблицу последних трех цифр x*77 для всех 100<=x<=999 и по ней искать все.

Автор: mmvds 5.5.2008, 09:14
Цитата(Beltar @  5.5.2008,  09:03 Найти цитируемый пост)

Зачем? Составить просто таблицу последних трех цифр x*77 для всех 100<=x<=999 и по ней искать все. 

В этом случае перебор будет из 899=999-100 вариантов для каждого числа, в моем случае всего 99 вариантов, хотя у будет еще взятие остатка.
В общем тут спорно, что будет работать быстрее. Да и в памяти мне понадобится всего 2 целочисленных переменных, вам 900.

И кстати тогда уж от 000 (если одного символа до трех знаков не хватило, а следующий за ним начинается с 0)  до 933

Автор: Beltar 5.5.2008, 11:55
Т. е. от 001 до 999 даже.
Я предлагаю посчитать
Код

for i:=1 to 999 do
  begin
  M[i]:=IntToStr(i*77);
  if Length(M[i])<3 then M[i]:='0'+M[i];
  M[i]:=Copy(M[i],Lenght(M[i]-2,3);
  end;


Цитата

В общем тут спорно, что будет работать быстрее.


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

Цитата

Для каждого из них перебором находим такие две первых цифры (от 00 до 99) чтоб полученное число делилось без остатка на 77


Какие 2 цифры? Какое число?

Ну допустим я взял слово "ас", последовательность "0119" Берем группы по 3 цифры "011", "900" Что дальше с ними делать?

Автор: mmvds 5.5.2008, 15:13
Цитата(Beltar @  5.5.2008,  11:55 Найти цитируемый пост)
Ну допустим я взял слово "ас", последовательность "0119" Берем группы по 3 цифры "011", "900" Что дальше с ними делать? 

Внимательнее читайте условие:
Цитата

Полученную цифровую последовательность разбили (справа налево)


Шифрование:
для данного примера "ас"  "0119" разбиваем по 3 цифры будет "000" "119" т.к. разбиваем СПРАВА налево, далее нам нужно умножить эти числа на 77, оставляем 3 последних цифры "000" "163", получим нужную последовательность 000163

Расшифровка по  моему алгоритму:
последовательность: 000163

1) Разбиваем исходную последовательность на трехзначные числа 
000 163
2) Для каждого из них перебором находим такие две первых цифры (от 00 до 99) чтоб полученное число делилось без остатка на 77
00 000 mod 77=0
09 163 mod 77=0
3) Делим полученные числа на 77
000
119
4) Приводим частные к трехзначной длинне и соединяем в одну последовательность 000119
5) Разбиваем полученную последовательность по две цифры 00 01 19
6) Подставляем согласно алфавиту каждому номеру буквы ас


Цитата(Beltar @  5.5.2008,  11:55 Найти цитируемый пост)
Какие 2 цифры? Какое число?
 2 цифры, потому что трехзначное*77=пятизначное, три цифры у нас есть, две остальные находим перебором.

Автор: mmvds 5.5.2008, 15:56
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  s,kon,viv,ch:string;
  i,j:integer;
  str:array[1..1000]of string[3];
  flag:boolean;
const
  alf='абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
begin
  s:=Edit1.Text;
  kon:='';
  viv:='';
  while length(s) mod 3<>0 do s:='0'+s;
  for i:=1 to length(s) div 3 do
  begin
    str[i]:=copy(s,i*3-2,3);
    j:=0;
    flag:=false;
    while (flag=false) and (j<=99) do
      begin
      inc(j);
      ch:=inttostr(j)+str[i];
      if strtoint(ch) mod 77 =0 then flag:=true;
      end;
    ch:=inttostr(strtoint(ch) div 77);
    while length(ch) mod 3<>0 do ch:='0'+ch;
    kon:=kon+ch;
  end;
  for i:=1 to length(kon) div 2 do viv:=viv+alf[strtoint(copy(kon,i*2-1,2))];
  Edit2.Text:=viv;
end;

Button1- кнопка,
Edit1 - вводим шифрованный текст
Edit2 - сюда выведется расшифрованный текст

Проверил работу программы на коде из условия:
317564404970017677550547850355

Результат строка:
ключшифранайден

Автор: Venom88 5.5.2008, 16:21
спасибо...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)