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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятное условие задачи 
:(
    Опции темы
Mastodont
Дата 26.1.2010, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У Дейтлов есть задачка:
Цитата

Компания хочет передавать данные по телефону, но она обеспокоена возможностью телефонного перехвата. Все передаваемые данные являются четырехзначными целыми числами. Компания попросила вас написать программу, которая должна шифровать эти данные так, чтобы они могли передаваться с большей безопасностью. Ваша программа должна читать целые четырехзначные числа и шифровать их следующим образом: заменять каждую цифру значением остатка от деления: (сумма это цифры плюс 7) / 10. Затем менять местами первую цифру с третьей и вторую с четвертой. Затем печатать полученное зашифрованное целое. Напишите отдельную программу, которая вводила бы зашифрованные четырехзначные целые и дешифровала их, получая исходные числа.


Программу шифрования я написал. А вот с чем работать программе дешифрования? Например, вводим 1234. С первым числом произойдут следующие действия:

(1+7) % 10 = 0.8

В итоге получаем дробную часть 8. А чтобы вернуть цифру 1, надо 0.8 * 10 - 7. Но программа-дешифратор получит не 0.8, а только 8. Откуда ей знать, что раньше там было 0.8 ? Ведь могло быть и 1.8, и 2.8 и что угодно вообще.

У кого какие мысли?
PM MAIL   Вверх
mes
Дата 26.1.2010, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



речь о целочисленном делении и нужно использовать значение
Цитата(Mastodont @  26.1.2010,  12:41 Найти цитируемый пост)
 остатка от деления

так что никаких дробей.
 smile 

Это сообщение отредактировал(а) mes - 26.1.2010, 13:47


--------------------
PM MAIL WWW   Вверх
Mastodont
Дата 26.1.2010, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @ 26.1.2010,  13:45)
речь о целочисленном делении и нужно использовать значение
Цитата(Mastodont @  26.1.2010,  12:41 Найти цитируемый пост)
 остатка от деления

так что никаких дробей.
 smile

То есть от полученных 0.8 я должен использовать не 8, а как раз 0? То есть должен считать 9 / 10 = 0?
PM MAIL   Вверх
NewDima
Дата 26.1.2010, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

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



Mastodont, это проблемы программы дешифратора, а не твои

Добавлено через 1 минуту и 18 секунд
а mes, я полагаю, имел ввиду, что не имеет значения, что там было в целой части
PM ICQ   Вверх
world
Дата 26.1.2010, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 2.10.2009
Где: Харьков

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



n = (n + 7) % 10 уникально для n = 10(количество цифр в 10-ричной СС), поэтому целая часть не несёт никакого значения. Предлагаю следующий алгоритм:

Код

//n - цифра которую нужно расшифровать.
int func(int n)
{
   n -= 7;
   if(n < 0)
   {
      n += 10;
   }
   return n;
}


Это сообщение отредактировал(а) world - 26.1.2010, 14:39
--------------------
Say what you mean, and mean what you say. Robert Wilson Cody
PM MAIL WWW ICQ Skype   Вверх
Mastodont
Дата 26.1.2010, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так, рассуждаем:

Вводим n = 1
Оно шифруется:
(1 + 7) / 10 = 0,8

Целочисленный остаток от деления: 0

Код

int func (N = 0)
{
   n = n - 7; // получаем -7
   if (n < 0) // условие выполняется
   {
      n = n + 10; // n = (-7) + 10 = 3
   }

   return n; // получаем 3. А вводили же 1. Почему так?
}

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


любитель
****


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

Репутация: 79
Всего: 250



Цитата(Mastodont @  26.1.2010,  12:53 Найти цитируемый пост)
То есть от полученных 0.8 я должен использовать не 8, а как раз 0? То есть должен считать 9 / 10 = 0? 

почитайте для начала что есть остаток.. в школе изучали то ли во 2м, максимум в 3м классе.
вначале хоть с цифрой и не ошиблись, но 
Цитата(Mastodont @  26.1.2010,  12:41 Найти цитируемый пост)
Ведь могло быть и 1.8, и 2.8 и что угодно вообще.

откуда могло ?

Цитата(NewDima @  26.1.2010,  13:05 Найти цитируемый пост)
полагаю, имел ввиду, что не имеет значения, что там было в целой части 

 smile, потому как
Цитата(world @  26.1.2010,  13:19 Найти цитируемый пост)
n = (n + 7) % 10 уникально для n = 10(количество цифр в 10-ричной СС),


Цитата(world @  26.1.2010,  13:19 Найти цитируемый пост)
Предлагаю следующий алгоритм:

тогда я тоже предложу : encode_digit  = (n+3) % 10;

Добавлено через 2 минуты и 35 секунд
Цитата(Mastodont @  26.1.2010,  14:03 Найти цитируемый пост)
Оно шифруется:
(1 + 7) / 10 = 0,8

нет
code_digit = (1+7) % 10; // == 8


Это сообщение отредактировал(а) mes - 26.1.2010, 15:04


--------------------
PM MAIL WWW   Вверх
Mastodont
Дата 26.1.2010, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

почитайте для начала что есть остаток.. в школе изучали то ли во 2м, максимум в 3м классе.

делимое / делитель = частное
Остаток, по идее, дробная часть частного. Разве нет?

Это сообщение отредактировал(а) Mastodont - 26.1.2010, 15:39
PM MAIL   Вверх
CPUSoul
Дата 26.1.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.1.2010
Где: Матушка Германия

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



Цитата(Mastodont @  26.1.2010,  15:34 Найти цитируемый пост)
Остаток, по идее, дробная часть частного. Разве нет?

5 % 3 = 2
2 это остаток, потому что в 5 вмещается только 1 раз тройка, а то что остается, так как вместить вторую тройку нельзя, мы называем "остатком".
10%3 = 1
Три раза вместили тройку, осталась еще 1.
То что ты говоришь, это всего лишь "дробная часть" числа. Не путай два понятия.
http://ru.wikipedia.org/wiki/%D0%94%D0%B5%...%BA%D0%BE%D0%BC

Операцию получения "остатка" от деления одного числа на другое обычно записывают через "%", операцию деления одного числа на другое как "/".

Это сообщение отредактировал(а) CPUSoul - 26.1.2010, 15:50
PM MAIL   Вверх
mes
Дата 26.1.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(Mastodont @  26.1.2010,  14:34 Найти цитируемый пост)
Остаток, по идее, дробная часть частного. Разве нет?

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



--------------------
PM MAIL WWW   Вверх
Mastodont
Дата 26.1.2010, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

это проблемы программы дешифратора, а не твои

Так дешифратор-то я делаю. Значит мои  smile 

Так, в условии задачи написано:
Цитата

заменять каждую цифру значением остатка от деления: (сумма это цифры плюс 7) / 10

т.е. у числа 1234 цифра "1" будет шифроваться так:

(1 + 7 )/10 = 8 / 10 = 0.8

Какой здесь будет остаток? Как я понимаю, им является "8".
Цитата

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

Это получается, что кому-то билетов вообще не хватило?  smile 

Это сообщение отредактировал(а) Mastodont - 26.1.2010, 15:53
PM MAIL   Вверх
mes
Дата 26.1.2010, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(Mastodont @  26.1.2010,  14:48 Найти цитируемый пост)
Какой здесь будет остаток? Как я понимаю, им является "8".

Не понимаете, а случайно совпадает.. Если бы делитель не был бы 10, то не угадали бы.

В выражении
Цитата(Mastodont @  26.1.2010,  14:48 Найти цитируемый пост)
(1 + 7 )/10 = 8 / 10 = 0.8

нет остатка.. все поделено.. (хотя поделено не правильно.. попробуйте спросить у компилятора.. однозначно он покажет не 0.8 smile )
а вот 
(1+7) % 10 = 8

Цитата(Mastodont @  26.1.2010,  14:48 Найти цитируемый пост)
Это получается, что кому-то билетов вообще не хватило?  smile 

Прально не хватило.. но нас не интересует кому и сколько досталось. Нас интересует остаток, то что осталось лежать на столе.  smile  
smile



--------------------
PM MAIL WWW   Вверх
CPUSoul
Дата 26.1.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.1.2010
Где: Матушка Германия

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



Цитата(Mastodont @  26.1.2010,  15:48 Найти цитируемый пост)
Какой здесь будет остаток? Как я понимаю, им является "8".

Нет, значением будет 0. Потому что при делении "/", а не "%" тип int отбросит "дробную часть" и оставит целую. Которая равна 0.  А остаток действительно 8, просто оператор нужно использовать другой. Именно "%", а не "/".
Сделай так:
Код

int x = 10 / 6;
float y = 10 / 6;
int z = 10 % 6;

Посмотри результаты и ты поймешь разницу.


Это сообщение отредактировал(а) CPUSoul - 26.1.2010, 16:25
PM MAIL   Вверх
Mastodont
Дата 27.1.2010, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Не понимаете, а случайно совпадает.. Если бы делитель не был бы 10, то не угадали бы.


Цитата

нет остатка.. все поделено..

Эх, да, остаток - это ж совсем другое  smile
14 поделить на 3, частное будет 4, а остаток 2. А если делимое меньше делителя, то остатка, получается, нет. И какже мне тогда зашифровать число 1? Мне ж надо вместо числа использовать остаток от деления (1-7)/10, то есть нуль. Или Дейтлы имели в виду именно операцию "%" ?

Цитата

при делении "/", а не "%" тип int отбросит "дробную часть" и оставит целую.

А кто сказал, что обязательно будет тип int? Это числа, которые уходят из шифратора и приходят дешифратору, должны быть целыми. А для операций шифрования-дешифрования могут использоваться переменные любых типов.
PM MAIL   Вверх
mes
Дата 27.1.2010, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(Mastodont @  27.1.2010,  07:42 Найти цитируемый пост)
А если делимое меньше делителя, то остатка, получается, нет

нет частного, остаток есть. его нет (равен нулю) если делится нацело, но в Вашем случае только один раз такое будет,
так что ни с чем не спутаете.

Цитата(Mastodont @  27.1.2010,  07:42 Найти цитируемый пост)
Мне ж надо вместо числа использовать остаток от деления (1-7)/10, то есть нуль.

где здесь остаток нашли ?!  smile 

Цитата(Mastodont @  27.1.2010,  07:42 Найти цитируемый пост)
Или Дейтлы имели в виду именно операцию "%" ?

 smile Перечитайте выше, Вам в каждом посте об этом  сообщают.  smile 
но в любом случае лучше поздно понять, чем никогда -  smile 

Цитата(Mastodont @  27.1.2010,  07:42 Найти цитируемый пост)
А кто сказал, что обязательно будет тип int? Это числа, которые уходят из шифратора и приходят дешифратору, должны быть целыми.

не важно инт или не инт - это Вам для облегчения представления говорилось.
Цитата(mes @  26.1.2010,  12:45 Найти цитируемый пост)
речь о целочисленном делении

и сказанное для инт действительно и для других целых чисел.

Цитата(Mastodont @  27.1.2010,  07:42 Найти цитируемый пост)
А для операций шифрования-дешифрования могут использоваться переменные любых типов. 

 smile могут, но зачем ? зачем выдумывать то, о чем  в задании даже и не пахнет ?!  smile 


Это сообщение отредактировал(а) mes - 27.1.2010, 09:56


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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