Форум программистов, компьютерный форум CyberForum.ru

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

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

C++ Шифрование
шифрование C++
C++ Шифрование
C++ Шифрование
C++ c++ шифрование
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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;
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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 |
rrrFer
Заблокирован
09.09.2010, 10:23     Шифрование чисел #4
silent_1991, угу и вычисляется он как (цифра+3)%10
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.09.2010, 10:25     Шифрование чисел #5
rrrFer,
Да, до этого я, как ни странно, догадался
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 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), а потом из него же восстанавливаю. Или может есть варианты лучше?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
10.09.2010, 15:20     Шифрование чисел #7
Цитата Сообщение от dihlofos Посмотреть сообщение
например 34567->01234->4567
Мне кажется это от того, что число 34567 просто не помещается в int. Либо используйте unsigned int, либо тип с большей вместительностью.
rrrFer
Заблокирован
10.09.2010, 15:27     Шифрование чисел #8
fasked, все помещается, но ноли в старших разрядах незначащие и не хранятся( 01234 )
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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;
}
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
10.09.2010, 15:34  [ТС]     Шифрование чисел #10
Цитата Сообщение от fasked Посмотреть сообщение
Мне кажется это от того, что число 34567 просто не помещается в int. Либо используйте unsigned int, либо тип с большей вместительностью.
Да нет, не в этом дело, даже большие числа проходят. (до 2147483647, у меня билдер стоит). А вот, например, даже 34 - нет. Вообще любое число с тройки.
А разве незначащий ноль впереди числа вообще сохраняется? Вводим например какое-нибудь 00025, сохраняется же просто 25.


Не по теме:

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

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

C++ Шифрование
Шифрование C++
Шифрование C++

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

Или воспользуйтесь поиском по форуму:
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
11.09.2010, 15:09  [ТС]     Шифрование чисел #15
Ну да, как вариант. Спасибо
Yandex
Объявления
11.09.2010, 15:09     Шифрование чисел
Ответ Создать тему
Опции темы

Текущее время: 22:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru