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

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

Войти
Регистрация
Восстановить пароль
 
dickivs
46 / 46 / 6
Регистрация: 25.11.2011
Сообщений: 275
Завершенные тесты: 1
#1

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

25.06.2013, 20:23. Просмотров 1082. Ответов 10
Метки нет (Все метки)

Всем привет, штурмую Дейтел, сталкнулся с задачей :
" Компания хочет передавать данные по телефону, но она обеспокоена возможностью телефонного перехвата. Все передаваемые данные являются четырехзначными целыми числами. Компания попросила вас написать программу, которая должна шифровать эти данные так, чтобы они могли передаваться с большей безопасностью. Ваша программа должна читать целые четырехзначные числа и шифровать их следующим образом: заменять каждую цифру значением (сумма этой цифры плюс 7) по модулю 10. Затем поменять местами первую цифру с третьей и вторую с четвертой и напечатать полученное зашифрованное целое. Напишите отдельную программу, которая вводила бы зашифрованные четырехзначные целые и дешифрировала их, получая исходные числа."
Проблема: если имеется число 1234, то исходя из постановки задачи если к 1+7 / 10 и 2+7 / 10 по модулю всегда будут 0, в таком случае появится противоречие при шифрации и дешифрации, или я не понял смысла или пожалуйста расстолкуйте новичку с пониманием сути данной задачи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2013, 20:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Задача на зашифрование 4-х значных чисел (C++):

Задача на рекурсию. Сколько существует k-значных натуральных чисел, сумма цифр которых равна s - C++
Задание (нужно выполнять рекурсией): Даны натуральные числа k и s. Определите, сколько существует k-значных натуральных чисел, сумма...

Дана последовательность целых чисел, последнее из которых 0. Найти количество 3-значных чисел - C++
Дана последовательность целых чисел, последнее из которых 0. Найти количество 3-значных чисел. cout << "Dano: " << endl; cin...

Сравнение двух n – значных чисел - C++
Всем доброго дня. Подскажите пожалуйста что я делаю не так: Задание: Составить программу для сравнения двух n – значных чисел (n >...

Вывод всех n-значных чисел - C++
Вывод всех Х значных (х<=10) десятичных чисел, сумма цифр крирпых равна данному целому цислу P<90. Число X и P вводится с клавиатуры.

Найти сумму всех n-значных чисел 1<=n<=4 - C++
Найти сумму всех n-значных чисел 1&lt;=n&lt;=4 может я тупой или от голода не могу думать, но объясните мне что надо сделать в этом задании....

Сортировка 3-х значных чисел в порядке возрастания - C++
Надо написать программу на С++. Сортировка 3-х значных чисел в порядке возрастания))

10
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
25.06.2013, 20:36 #2
Цитата Сообщение от dickivs Посмотреть сообщение
Проблема: если имеется число 1234, то исходя из постановки задачи если к 1+7 / 10 и 2+7 / 10 по модулю всегда будут 0, в таком случае появится противоречие при шифрации и дешифрации, или я не понял смысла или пожалуйста расстолкуйте новичку с пониманием сути данной задачи.
По модулю, а не деление, mod, %

a % x = b, где b примет значение от 0 до x - 1
И нюанс: 8 % 10 = 8
15 % 10 = 5
1
MrGluck
Модератор
Эксперт CЭксперт С++
7769 / 4805 / 745
Регистрация: 29.11.2010
Сообщений: 13,122
25.06.2013, 21:02 #3
Цитата Сообщение от dickivs Посмотреть сообщение
1+7 / 10 и 2+7 / 10 по модулю всегда будут 0
а я всегда думал, что 8 и 9.
Деление по модулю это %
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
25.06.2013, 21:26 #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;
}
0
dickivs
46 / 46 / 6
Регистрация: 25.11.2011
Сообщений: 275
Завершенные тесты: 1
26.06.2013, 21:56  [ТС] #5
в данной задаче есть некторые сложности, а как быть если вводят 3333???? выходные данные не всегда 4-х значные? получаются 0000????
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
26.06.2013, 22:30 #6
@dickivs, если вводят 3333, то закодированное слово - 0, если его декодировать, то выйдет 3333.
Цитата Сообщение от dickivs Посмотреть сообщение
выходные данные не всегда 4-х значные?
да
0
dickivs
46 / 46 / 6
Регистрация: 25.11.2011
Сообщений: 275
Завершенные тесты: 1
29.06.2013, 14:19  [ТС] #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;
}
Думаю это элегантнее вышеуказанных примеров кодов?
0
Мимино
183 / 154 / 6
Регистрация: 22.05.2013
Сообщений: 450
Записей в блоге: 1
29.06.2013, 15:52 #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;
}
0
Миниатюры
Задача на зашифрование 4-х значных чисел   Задача на зашифрование 4-х значных чисел  
Мимино
183 / 154 / 6
Регистрация: 22.05.2013
Сообщений: 450
Записей в блоге: 1
29.06.2013, 16:06 #9
@Olivеr,
Эта задача из 2-й главы, массивы читатель "еще не изучал"

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

Распечатать квадраты только 3-значных чисел от 1 до N - C++
2. Распечатать квадраты только 3-значных чисел от 1 до N. 3. Распечатать все числа от 1 до N, не оканчивающиеся на цифру 3. ...

Дано число n. Найти сумму n-значных чисел - C++
Кто может решит такую задачу. Дано число n. Найти сумму n-значных чисел. Ограничениа 0&lt;n&lt;=100. Хочу сказать что эту задачу я решил,...

Посчитать сумму произведений всех N-значных чисел - C++
Всем добрый день! Есть задание - требуется вычислить сумму произведений цифр каждого N-значного числа. При этом следует учесть, что...

Определить количество 8-значных чисел, у которых сумма цифр... - C++
Дано натуральное число N. Определить количество 8-значных чисел, у которых сумма цифр в цифровой записи числа была меньше, чем N. Если...


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

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

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