所以我试图通过在数字上加7来加密4位整数,然后将整数除以10。在我的程序中,我分别取每个数字,然后我需要将整个数字除以10。如何将所有单独的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);
}
}
您可能已经注意到我将每个数字分开。我需要一起做。然后我也在创建一个解密,我将在单独的程序中将我带回原始号码。
答案 0 :(得分:4)
根据您的评论,您尝试对Caesar Cipher进行变体处理,在这种情况下,您应该使用模数运算符(%
)而不是整数除法运算符(/
)。使用整数除法会丢失将阻止您解密的信息。当你的数字在{0,1,2}时,你的除法产生0.当它在{3,4,5,6,7,8,9}时,除法产生1.你不能将{0,1}解密回原始号码,而没有一些额外的信息(你已经丢弃了)。
如果要使用Caesar Cipher方法逐位加密,则应使用modulo arithmetic,以便每个数字都具有唯一的加密值,可在解密期间检索。如果那真的是你想要的那么你应该做以下的事情来加密7:
a = (a + 7) % 10;
b = (b + 7) % 10;
c = (c + 7) % 10;
d = (d + 7) % 10;
要减去,你减去7,其中mod 10算术是3的加法,因此它将是:
a = (a + 3) % 10;
b = (b + 3) % 10;
c = (c + 3) % 10;
d = (d + 3) % 10;
这当然预先假定您已经正确验证了您的输入(上例中的情况并非如此)。
答案 1 :(得分:1)
这是你可能正在寻找的东西:
int e = (a*1000)+(b*100)+(c*10)+d;
e=e/10;
答案 2 :(得分:1)
将各个数字组合成一个四位数字很简单;只需将第一个数字加倍,加上第二个数字乘以100,依此类推。
但这是一种单向算法;你将永远无法从中检索原始的四位数字。
答案 3 :(得分:0)
从你的描述中不清楚添加是否应该是模10;如果是的话
((((((a % 10) * 10) + (b % 10)) * 10) + (c % 10)) * 10) + (d % 10)
如果你不想要modulo 10
(((((a * 10) + b) * 10) + c) * 10) + d
答案 4 :(得分: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。