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

Задача на зашифрование 4-х значных чисел - C++

Восстановить пароль Регистрация
 
dickivs
 Аватар для dickivs
46 / 46 / 6
Регистрация: 25.11.2011
Сообщений: 267
25.06.2013, 20:23     Задача на зашифрование 4-х значных чисел #1
Всем привет, штурмую Дейтел, сталкнулся с задачей :
" Компания хочет передавать данные по телефону, но она обеспокоена возможностью телефонного перехвата. Все передаваемые данные являются четырехзначными целыми числами. Компания попросила вас написать программу, которая должна шифровать эти данные так, чтобы они могли передаваться с большей безопасностью. Ваша программа должна читать целые четырехзначные числа и шифровать их следующим образом: заменять каждую цифру значением (сумма этой цифры плюс 7) по модулю 10. Затем поменять местами первую цифру с третьей и вторую с четвертой и напечатать полученное зашифрованное целое. Напишите отдельную программу, которая вводила бы зашифрованные четырехзначные целые и дешифрировала их, получая исходные числа."
Проблема: если имеется число 1234, то исходя из постановки задачи если к 1+7 / 10 и 2+7 / 10 по модулю всегда будут 0, в таком случае появится противоречие при шифрации и дешифрации, или я не понял смысла или пожалуйста расстолкуйте новичку с пониманием сути данной задачи.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
25.06.2013, 20:36     Задача на зашифрование 4-х значных чисел #2
Цитата Сообщение от dickivs Посмотреть сообщение
Проблема: если имеется число 1234, то исходя из постановки задачи если к 1+7 / 10 и 2+7 / 10 по модулю всегда будут 0, в таком случае появится противоречие при шифрации и дешифрации, или я не понял смысла или пожалуйста расстолкуйте новичку с пониманием сути данной задачи.
По модулю, а не деление, mod, %

a % x = b, где b примет значение от 0 до x - 1
И нюанс: 8 % 10 = 8
15 % 10 = 5
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
25.06.2013, 21:02     Задача на зашифрование 4-х значных чисел #3
Цитата Сообщение от dickivs Посмотреть сообщение
1+7 / 10 и 2+7 / 10 по модулю всегда будут 0
а я всегда думал, что 8 и 9.
Деление по модулю это %
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
25.06.2013, 21:26     Задача на зашифрование 4-х значных чисел #4
Даже если взять 1234, то декодирование даст 1204
Кодирование:
1234
8901 // (x + 7) % 10
0981 //0 2
0189 //1 3
= 189

Декодирование:
0189
0412 // if (x % 10 > 6) - > x % 10 - 7, else x % 10 + 3
1402 //0 2
1204 //1 3
= 1204
Может в учебнике есть пример?

Добавлено через 7 минут
Цитата Сообщение от Olivеr Посмотреть сообщение
Даже если взять 1234, то декодирование даст 1204
все, я сообразил как исправить
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
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <stdexcept>
using namespace std;
 
int encode(int x) throw(invalid_argument)
{
    if (x < 1000 || x > 9999)
        throw invalid_argument("x must be in [1000; 9999]\n");
    int a[4] = {0, 0, 0, 0};
    for(int i = 3; x; --i, x /= 10)
        a[i] = ( x + 7 ) % 10;
    swap(a[0], a[2]);
    swap(a[1], a[3]);
    int new_x = a[3] + a[2] * 10 + a[1] * 100 + a[0] * 1000;
    return new_x;
}
 
int decode(int x) throw(invalid_argument)
{
    if (x > 9999)
        throw invalid_argument("x is greater than 9999\n");
    int a[4] = {0, 0, 0, 0};
    if (x < 999) a[0] = 3;
    if (x < 99) a[1] = 3;
    if (x < 9) a[2] = 3;
    for(int i = 3; x; --i, x /= 10)
        if ( x % 10 > 6 ) a[i] = x % 10 - 7;
        else a[i] = x % 10 + 3;
    swap(a[0], a[2]);
    swap(a[1], a[3]);
    int new_x = a[3] + a[2] * 10 + a[1] * 100 + a[0] * 1000;
    return new_x;
 
}
int main()
{
    cout << "X   \tEncoded\tDecoded\n";
    for (int x, i = 1000; i != 10000; ++i) {
        x = encode(i);
        cout << i << "\t" << x;
        x = decode(x);
        cout << "\t" << x << endl;
    }
    return 0;
}
Добавлено через 7 минут
UPD:
исправил ошибку
Кликните здесь для просмотра всего текста
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
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <stdexcept>
using namespace std;
 
int encode(int x) throw(invalid_argument)
{
    if (x < 1000 || x > 9999)
        throw invalid_argument("x must be in [1000; 9999]\n");
    int a[4] = {0, 0, 0, 0};
    for(int i = 3; x; --i, x /= 10)
        a[i] = ( x + 7 ) % 10;
    swap(a[0], a[2]);
    swap(a[1], a[3]);
    int new_x = a[3] + a[2] * 10 + a[1] * 100 + a[0] * 1000;
    return new_x;
}
 
int decode(int x) throw(invalid_argument)
{
    if (x > 9999)
        throw invalid_argument("x is greater than 9999\n");
    int a[4] = {0, 0, 0, 0};
    if (x <= 999) a[0] = 3;
    if (x <= 99) a[1] = 3;
    if (x <= 9) a[2] = 3;
    if (x == 0) a[3] = 3;
    for(int i = 3; x; --i, x /= 10)
        if ( x % 10 > 6 ) a[i] = x % 10 - 7;
        else a[i] = x % 10 + 3;
    swap(a[0], a[2]);
    swap(a[1], a[3]);
    int new_x = a[3] + a[2] * 10 + a[1] * 100 + a[0] * 1000;
    return new_x;
 
}
int main()
{
    cout << "X   \tEncoded\tDecoded\n";
    for (int x, i = 1000; i != 10000; ++i) {
        x = encode(i);
        if (i != decode(x))
            cout << i << "\t" << x << "\t" << x << endl;
    }
    return 0;
}
dickivs
 Аватар для dickivs
46 / 46 / 6
Регистрация: 25.11.2011
Сообщений: 267
26.06.2013, 21:56  [ТС]     Задача на зашифрование 4-х значных чисел #5
в данной задаче есть некторые сложности, а как быть если вводят 3333???? выходные данные не всегда 4-х значные? получаются 0000????
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
26.06.2013, 22:30     Задача на зашифрование 4-х значных чисел #6
@dickivs, если вводят 3333, то закодированное слово - 0, если его декодировать, то выйдет 3333.
Цитата Сообщение от dickivs Посмотреть сообщение
выходные данные не всегда 4-х значные?
да
dickivs
 Аватар для dickivs
46 / 46 / 6
Регистрация: 25.11.2011
Сообщений: 267
29.06.2013, 14:19  [ТС]     Задача на зашифрование 4-х значных чисел #7
Решил обойти проблемы при вводе данных, допустим пользователь вводит только отдельные цифры.
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
 
int main()
{
    int dig1, dig2,
        dig3, dig4;
    
    int encrDig1, encrDig2,
        encrDig3, encrDig4;
 
    cout << "Enter initial number digits for encrypting ( 4 digits ): ";
    cin >> dig1 >> dig2 >> dig3 >> dig4;
 
    if( ( ( dig1 > 0 ) && ( dig1 < 10 )) && 
        ( ( dig2 > 0 ) && ( dig2 < 10 )) &&
        ( ( dig3 > 0 ) && ( dig3 < 10 )) &&
        ( ( dig4 > 0 ) && ( dig4 < 10 )) ){
 
    encrDig1 = ( dig1 + 7 ) % 10;
    encrDig2 = ( dig2 + 7 ) % 10;
    encrDig3 = ( dig3 + 7 ) % 10;
    encrDig4 = ( dig4 + 7 ) % 10;
 
 
    cout << "Encrypted number: ";
    cout << encrDig3 << encrDig4 << encrDig1 << encrDig2 <<endl;
 
    }   
 
    cout << "Enter encrypted number digits for decrypting ( 4 digits ): ";
    cin >> dig1 >> dig2 >> dig3 >> dig4;
 
    if( ( dig1 >= 0 && dig1 < 10 ) && 
        ( dig2 >= 0 && dig2 < 10 ) &&
        ( dig3 >= 0 && dig3 < 10 ) &&
        ( dig4 >= 0 && dig4 < 10 ) ){
    
            encrDig1 = (( dig3 + 10 ) - 7 ) % 10;
            encrDig2 = (( dig4 + 10 ) - 7 ) % 10;
            encrDig3 = (( dig1 + 10 ) - 7 ) % 10;
            encrDig4 = (( dig2 + 10 ) - 7 ) % 10;
 
        cout << "Decrypted number: ";
        cout << encrDig1 << encrDig2 << encrDig3 << encrDig4 <<endl;
    }
 
    return 0;
}
Думаю это элегантнее вышеуказанных примеров кодов?
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
29.06.2013, 15:52     Задача на зашифрование 4-х значных чисел #8
Делал эту задачу.
шифрование:
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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
 
int main()
{
    int x = 0;
 
    while (x != -1)
    {
        cout << "Vvedite 4-h znachnoe chislo (-1, esli vvod okonchen): ";
        cin >> x;
        if (x == -1)
            break;
        cout << "Shifr: " << (((x % 100) / 10) + 7) % 10
             << ((x % 10) + 7) % 10 << ((x / 1000) + 7) % 10
             << (((x % 1000) / 100) + 7) % 10 << endl << endl;
    }
 
    cout << "\n\nVvedite celoe chislo: ";
    cin >> x;
    return 0;
}
дешифрование
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
33
34
35
36
37
38
39
#include "stdafx.h"
#include <iostream>
using namespace std;
 
 
int main()
{
    int x = 0;
 
    while (x != -1)
    {
        cout << "Vvedite zashifrovannoe chislo (-1, esli vvod zakonchen): ";
        cin >> x;
 
        if (x == -1)
            break;
 
        if (((x % 100) / 10) < 7)
            cout << "Chislo: " << ((x % 100) / 10) + 3;
        else
            cout << "Chislo: " << ((x % 100) / 10) - 7;
        if ((x % 10) < 7)
            cout << (x % 10) + 3;
        else
            cout << (x % 10) - 7;
        if ((x / 1000) < 7)
            cout << (x / 1000) + 3;
        else
            cout << (x / 1000) - 7;
        if (((x % 1000) / 100) < 7)
            cout << ((x % 1000) / 100) + 3 << endl << endl;
        else
            cout << ((x % 1000) / 100) - 7 << endl << endl;
    }
 
    cout << "\n\nVvedite celoe chislo: ";
    cin >> x;
    return 0;
}
Миниатюры
Задача на зашифрование 4-х значных чисел   Задача на зашифрование 4-х значных чисел  
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
29.06.2013, 16:06     Задача на зашифрование 4-х значных чисел #9
@Olivеr,
Эта задача из 2-й главы, массивы читатель "еще не изучал"

Цитата Сообщение от dickivs Посмотреть сообщение
Решил обойти проблемы при вводе данных, допустим пользователь вводит только отдельные цифры.
@dickivs,
это нарушает условие задачи
Цитата Сообщение от dickivs Посмотреть сообщение
программа должна читать целые четырехзначные числа
Добавлено через 4 минуты
Цитата Сообщение от Olivеr Посмотреть сообщение
@dickivs, если вводят 3333, то закодированное слово - 0, если его декодировать, то выйдет 3333.
да
Нет, выходные данные ВСЕГДА четырехзначные, потому что выходные данные это не целое число, а зашифрованное целое число. Шифр, другими словами. А это две разные вещи.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
29.06.2013, 16:09     Задача на зашифрование 4-х значных чисел #10
@Мимино, зависит от того как представлять закодированное слово. Если как число, то 0, а если строкой, то 0000
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2013, 16:18     Задача на зашифрование 4-х значных чисел
Еще ссылки по теме:

C++ Сортировка 3-х значных чисел в порядке возрастания
Дана последовательность целых чисел, последнее из которых 0. Найти количество 3-значных чисел C++
Наибольший общий делитель для двух 80-значных чисел C++

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

Или воспользуйтесь поиском по форуму:
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
29.06.2013, 16:18     Задача на зашифрование 4-х значных чисел #11
Цитата Сообщение от Olivеr Посмотреть сообщение
@Мимино, зависит от того как представлять закодированное слово. Если как число, то 0, а если строкой, то 0000
Это зависит от того, какой используется алгоритм шифрования. В данном случае - шифр Цезаря. "Сдвиговые" алгоритмы всегда подразумевают получение на выходе последовательности той же длины, что и на входе.
Yandex
Объявления
29.06.2013, 16:18     Задача на зашифрование 4-х значных чисел
Ответ Создать тему
Опции темы

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