2011-10-15 158 views
1

所以我试图加密一个四位数的整数,在数字中加上七,然后将整数除以十。在我的计划中,我分别取每个数字,然后我需要将整个数字除以十。我怎样才能将所有单独的int整合成一个四位数字?加密数字C++

#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); 
    } 
} 

正如您可能注意到的那样,我将每个数字分开。我需要一起做。然后我还创建了一个解密,我将在单独的程序中让我回到原始数字。

+2

'if(ext == 1)'。您需要使用'=='运算符,但不要使用'='运算符。 '='用于赋值而不用于逻辑比较。这个问题有点不清楚。你能解释一下,你会为​​a,b,c,d选择什么样的输入? – Mahesh

+0

“将它们分在一起”是什么意思? – Mat

+0

这是功课吗?如果是这样,请相应标记。 – Uffe

回答

1

个人数字组合成一个四位数字简单;将第一位数字乘以1000,将第二位乘以100,依此类推。

但是这是一种单向算法;您将永远无法从中检索原始的四位数字。

1

这是youd'd可能会寻找:

int e = (a*1000)+(b*100)+(c*10)+d; 
e=e/10; 
+0

,如果你愿意,你也可以在这一步本身中加入7。 – COD3BOY

+0

谢谢!我也被告知这不是加密。我想跟着我的书,但有麻烦。 –

0

从描述中不清楚加法是否应该是模10;如果是这样

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

如果你不想模10

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

基于您的评论你正在尝试做的Caesar Cipher的变化,在这种情况下,你应该使用模运算符(%)不是整数除法运算符(/)。使用整数除法会丢失将阻止您解密的信息。当你的数字位于{0,1,2}时,你的分区结果为0.当它位于{3,4,5,6,7,8,9}时,分区结果为1.你不能将{0,1}解密成原始数字,而不需要一些额外的信息(你已经丢弃了这些信息)。

如果要使用凯撒密码方法逐位进行加密,则应该使用modulo arithmetic,以便每个数字都有唯一的加密值,可以在解密过程中进行检索。如果这真的是你正在寻找的,那么你应该做一些像下面有7加密:

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

要decrpyt,您可以通过3减去7,这在模10算术加法,从而使将是:

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

这当然预示着你已经正确验证了你的输入(在你上面的例子中不是这种情况)。

0

忽略一个事实,即你几乎可以肯定需要mod而不是除法(正如@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; 

它不会因为往返为字符串,并回作为一个4位数字的这条狭窄的情况下,乘法一样高效。但很高兴知道这项技术。而且这是一种编码风格,可以更容易地进行维护和适应。

如果您#include <sstream>,您将得到stringstream。