Зашифровать цифру C ++ - PullRequest
       273

Зашифровать цифру C ++

1 голос
/ 15 октября 2011

Итак, я пытаюсь зашифровать четырехзначное целое число, добавив к цифре семь, а затем разделив целую цифру на десять. В моей программе я беру каждую отдельную цифру отдельно, а затем мне нужно разделить всю цифру на десять. Как я могу объединить все отдельные int в одно четырехзначное число?

#include "stdafx.h"
using namespace std;

int main()
{
    //Define all variables needed
    int a,b,c,d,enc,ext;

    //Print dialog and input each single digit for the four number digit
    cout << "Enter Your First Digit:" << endl;
    cin >> a;
    cout << "Enter Your Second Digit:" << endl;
    cin >> b;
    cout << "Enter Your Third Digit:" << endl;
    cin >> c;
    cout << "Enter Your Fourth Digit:" << endl;
    cin >> d;
    //Add seven to each digit
    a += 7;
    b += 7;
    c += 7;
    d += 7;

    a /= 10;
    b /= 10;
    c /= 10;
    d /= 10;

    cout << "Your encrpyted digits:" << c << d << a << b <<endl;

    cout << "Enter 1 to exit:" <<endl;
    cin >> ext;

    if (ext = 1) {
        exit(EXIT_SUCCESS);
    }
}

Как вы, наверное, заметили, я делю каждое число отдельно. Мне нужно сделать их вместе. Затем я также создаю расшифровку, которая вернет меня к исходному номеру в отдельной программе.

Ответы [ 5 ]

4 голосов
/ 15 октября 2011

Исходя из вашего комментария, вы пытаетесь внести изменения в Цезарь-шифр , и в этом случае вы должны использовать оператор модуля (%), а не оператор целочисленного деления (/) , Использование целочисленного деления приводит к потере информации, которая не позволит вам расшифровать. Когда ваша цифра находится в {0, 1, 2}, ваше деление приводит к 0. Когда это в {3, 4, 5, 6, 7, 8, 9}, деление приводит к 1. Вы не можете расшифруйте {0, 1} обратно на исходный номер без какой-либо дополнительной информации (которую вы отбросили).

Если вы хотите шифровать поразрядно с использованием подхода Цезаря Шифра, вы должны использовать по модулю арифметики , чтобы каждая цифра имела уникальное зашифрованное значение, которое можно получить во время дешифрования. Если это действительно то, что вы ищете, то вы должны сделать что-то вроде следующего, чтобы зашифровать с помощью 7:

    a = (a + 7) % 10;
    b = (b + 7) % 10;
    c = (c + 7) % 10;
    d = (d + 7) % 10;

Чтобы расшифровать, вычтите 7, которое в арифметике мода 10 является сложением на 3, так что это будет:

    a = (a + 3) % 10;
    b = (b + 3) % 10;
    c = (c + 3) % 10;
    d = (d + 3) % 10;

Это, конечно, предполагает, что вы правильно проверили свои данные (что не так в вашем примере выше).

1 голос
/ 15 октября 2011

Объединить отдельные цифры в одно четырехзначное число просто; просто умножьте первую цифру на 1000, добавьте вторую, умноженную на 100, и т. д.

Но это односторонний алгоритм; Вы никогда не сможете получить исходный четырехзначный номер из этого.

1 голос
/ 15 октября 2011

Это то, что вы, вероятно, искали бы:

int e = (a*1000)+(b*100)+(c*10)+d;
e=e/10;
0 голосов
/ 15 октября 2011

Если оставить в стороне тот факт, что вы почти наверняка хотите использовать mod вместо split (как сказал @Andand), существует несколько способов превратить цифры в числа!

Многие люди используют интерпретированные языкиэти дни, вероятно, хотели бы сделать это символическиC ++ тоже может сделать это, довольно аккуратно:

// create a string stream that you can write to, just like
// writing to cout, except the results will be stored
// in a string

stringstream ss (stringstream::in | stringstream::out);

// write the digits to the string stream
ss << a << b << c << d;

cout << "The value stored as a string is " << ss.str() << endl;

// you can also read from a string stream like you're reading
// from cin.  in this case we are reading the integer value
// that we just symbolically stored as a character string

int value;
ss >> value;

cout << "The value stored as an integer is " << value << endl;

Это не будет так же эффективно, как умножение в этом узком случае четырехзначного числа, из-за обратного пути к строке и обратно.Но хорошо знать технику.Кроме того, это стиль кодирования, который намного проще поддерживать и адаптировать.

Вы получите струнный поток, если вы #include <sstream>.

0 голосов
/ 15 октября 2011

Из вашего описания не ясно, должно ли добавление быть по модулю 10 или нет;если так

((((((a % 10) * 10) + (b % 10)) * 10) + (c % 10)) * 10) + (d % 10) 

если не хотите по модулю 10

(((((a * 10) + b) * 10) + c) * 10) + d 
...