Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.79
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
#1

Шифрование чисел - C++

09.09.2010, 08:27. Просмотров 2521. Ответов 14
Метки нет (Все метки)

Программа должна шифровать число следующим образом: заменять каждую цифру остатком от деления (цифра+7)/10. Затем написать программу дешифровки для получения исходных чисел. (Задачка взята собственно из книги Дейтела.) Первая часть затруднений не вызывает, а вот с дешифровкой не могу сообразить. Как из остатка можно получить исходное делимое? Диапазон чисел тут небольшой (получается от 7 до 16), поэтому делимое явно будет однозначным. А как это в формулу загнать-то? Спасибо.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2010, 08:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шифрование чисел (C++):

c++ шифрование - C++
Необходимо программно реализовать на языке C++ алгоритм шифра по Диффи – Хеллману с открытым ключом. Понятия не имею с чего начать....

Шифрование - C++
Доброго времени суток, сегодня весь день сидел и пытался разобрать задачу. Задается натуральное число k и перестановка чисел 1, ... , k...

Шифрование - C++
Собственно, вопрос не совсем по си++, но нашел это место оптимальным. Так вот, речь пойдет о шифровании. А точнее: стоит ли уповать на...

Шифрование - C++
я написал код шифрования #include <iostream> #include <fstream> #include <string> using namespace std; main() { //~...

Шифрование - C++
Привет всем:) особенно тем кто в этот день тратит свое время на программирование:) Помогите решить такую задачу. Есть целое число "1234"....

Шифрование - C++
Создать выходной зашифрованный файл на основе входного. Шифрование файла выполняется по следующему правилу: в каждом слове строки первый...

14
rrrFer
Заблокирован
09.09.2010, 10:14 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
#include <sstream>
using std::stringstream;
int main (){
    stringstream strm;
    int a,b;
 
    cin>>a;
 
    strm<<a;
    a=0;
    while(1){
        if((b=strm.get())<0)
            break;
        cout<<(b=(b+7-'0')%10);
        (a*=10)+=b;
    }
    strm.clear();
    strm<<a;
    cout<<endl;
    while(1){
        if((b=strm.get())<0)
            break;
        cout<<(b=(b+3-'0')%10);
    }
    
    cin.get(),cin.get();
    return 0;
}
1
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.09.2010, 10:17 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
У каждой цифры будет уникальный остаток.
Код
Цифра   | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Остаток | 7 | 8 | 9 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
3
rrrFer
Заблокирован
09.09.2010, 10:23 #4
silent_1991, угу и вычисляется он как (цифра+3)%10
1
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.09.2010, 10:25 #5
rrrFer,
Да, до этого я, как ни странно, догадался
0
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
10.09.2010, 09:03  [ТС] #6
Цитата Сообщение от rrrFer Посмотреть сообщение
угу и вычисляется он как (цифра+3)%10
Да, именно эту формулу мне и надо было. Я до этого чего-то не догадался Большое спасибо!

Добавлено через 20 часов 42 минуты
Кстати, наткнулся ещё на одну проблему. Если исходное число начинается на 3, то эта тройка шифруется в 0 => теряется. И исходное число уже не восстановить, например 34567->01234->4567. Исправил так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int main (){
        stringstream strm, tmp;
        int a,b;
 
        cin>>a;
 
        strm<<a;
        a=0;
        while(1){
                if((b=strm.get())<0)
                        break;
                cout<<(b=(b+7-'0')%10);
                tmp<<b;
 
        }
        cout<<endl;
        while(1){
                if((b=tmp.get())<0)
                        break;
                cout<<(b=(b+3-'0')%10);
        }
 
        cin.get(),cin.get();
        return 0;
}
Т.е. создал дополнительный stringstream, записываю зашифрованное число в него (вместо переменной a), а потом из него же восстанавливаю. Или может есть варианты лучше?
1
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
10.09.2010, 15:20 #7
Цитата Сообщение от dihlofos Посмотреть сообщение
например 34567->01234->4567
Мне кажется это от того, что число 34567 просто не помещается в int. Либо используйте unsigned int, либо тип с большей вместительностью.
0
rrrFer
Заблокирован
10.09.2010, 15:27 #8
fasked, все помещается, но ноли в старших разрядах незначащие и не хранятся( 01234 )
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
10.09.2010, 15:28 #9
fasked, А это уже смотря какой компилятор. У меня #define INT_MAX 2147483647 /* maximum (signed) int value */
#define UINT_MAX 0xffffffff /* maximum unsigned int value */
Проверь так автор.
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include <limits>
 
int main()
{
   std::cout<<std::numeric_limits<int>::max()<<'\n';
   return 0;
}
1
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
10.09.2010, 15:34  [ТС] #10
Цитата Сообщение от fasked Посмотреть сообщение
Мне кажется это от того, что число 34567 просто не помещается в int. Либо используйте unsigned int, либо тип с большей вместительностью.
Да нет, не в этом дело, даже большие числа проходят. (до 2147483647, у меня билдер стоит). А вот, например, даже 34 - нет. Вообще любое число с тройки.
А разве незначащий ноль впереди числа вообще сохраняется? Вводим например какое-нибудь 00025, сохраняется же просто 25.


Не по теме:

Пост писал долго, rrrFer и Lavroff уже за меня всё сказали

1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
10.09.2010, 15:38 #11
Да.
При вводе 025=25
А в тексте программы 025=21 (восьмеричная)
1
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.09.2010, 13:52 #12
А почему бы не работать с массивом, в каждой ячейке которого и хранить соответствующую цифру числа? Тогда и разбивать число на цифры не придётся, вы сразу будете вводить его в массив.
1
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
11.09.2010, 14:59  [ТС] #13
Да, конечно, можно и массивом. Просто понимаете, задачка взята чуть ли не из начала учебника. Предполагается, что студент не знает ничего ни про массивы, ни про потоки stringstream Т.е. решить её надо, используя только int переменные. А с ними 0 как раз и теряется. (Можно конечно замутить какую-нибудь вспомогательную переменную, где хранить число нулей, или что-нибудь ещё более извратное... но стоит ли выделываться)
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.09.2010, 15:02 #14
dihlofos,
Хорошо, можно посчитать количество разрядов в числе (скажем, оно равно n) и прибавить к числу 10^n. Тогда число из x1x1...xn превратится в 1x1x2...xn и 3 в начале исходного числа станет второй цифрой полученного числа и не потеряется.
1
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
11.09.2010, 15:09  [ТС] #15
Ну да, как вариант. Спасибо
0
11.09.2010, 15:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2010, 15:09
Привет! Вот еще темы с ответами:

Шифрование - C++
Как возможно проверить, насколько надежно шифрование?

шифрование - C++
помогите пожалуйста написать пргорамму!!! была бы очень благодрна!!! шифрование. один из методов шифрования называется...

Шифрование Blowfish - C++
Помогите отладить программу, режим шифрования - CTR.

Шифрование файла - C++
Здравствуйте, я новичок в С++, мне бы хотелось написать программу : На пример у меня имеется блокнот с логинами\паролями, Программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru