Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi] задачка по шифровке! 
:(
    Опции темы
Venom88
Дата 4.5.2008, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.5.2008

Репутация: -1
Всего: нет



помогите решить.....
Двузначные номера. Каждую букву исходного сообщения заменили её порядковым двузначным номером в русском алфавите согласно таблице:
а    б    в    г    д    е    ё    ж    з    и    й 
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.  
PM MAIL   Вверх
Venom88
Дата 4.5.2008, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.5.2008

Репутация: -1
Всего: нет



надо расшифровать и зашифровать.....я вроде это написал, присвоил каждой букве алфавита ее порядковый номер!! но вроде получилась одна фигня....может кто поможет решить(объеснить) эту задачку....
PM MAIL   Вверх
mmvds
Дата 4.5.2008, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 22.12.2007

Репутация: нет
Всего: 6



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

Начни делать, потом скажешь на каком этапе помочь.
PM MAIL ICQ   Вверх
Beltar
Дата 5.5.2008, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: нет
Всего: 7



Цитата

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


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


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
mmvds
Дата 5.5.2008, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 22.12.2007

Репутация: нет
Всего: 6



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

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

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

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

Это сообщение отредактировал(а) mmvds - 5.5.2008, 09:18
PM MAIL ICQ   Вверх
Beltar
Дата 5.5.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: нет
Всего: 7



Т. е. от 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" Что дальше с ними делать?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
mmvds
Дата 5.5.2008, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 22.12.2007

Репутация: нет
Всего: 6



Цитата(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=пятизначное, три цифры у нас есть, две остальные находим перебором.

PM MAIL ICQ   Вверх
mmvds
Дата 5.5.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 22.12.2007

Репутация: нет
Всего: 6



Код

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

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


Это сообщение отредактировал(а) mmvds - 5.5.2008, 15:57
PM MAIL ICQ   Вверх
Venom88
Дата 5.5.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.5.2008

Репутация: -1
Всего: нет



спасибо...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0720 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.