C++ 编程,编写一个程序,通过根据输入键重新排列输入字符串中的字符来加密用户输入消息,求代码
过程说明
消息:SEHH2042 Computer Programming is very EASY~!!
钥匙:3596047218
加密:
首先,每隔n个字符(n是键长)中断消息,并将其排列成行。每行有n个字符。最后几个空插槽中充满了空格。然后根据键,将列重新排列到新的列位置,即,将第0列放到第3列,将第1列放到第5列,将第2列放到第9列,依此类推…
最后,合并行以获取下面的加密文本。
加密:2 2S0EH4CHtP oemurrpmgnomgai reE irsvyA ! S Y! ~
如图所示。内容以英文为准。 展开
谢邀。
根据第二张图中的过程解释,可以对加密过程进行理解:
首先,每n个字符一行,构建出如图的矩阵。按照密钥顺序进行重新排序。最后合成一个字符串进行输出。我这里将这道题看成每n个字符一组,就不构建二维数组了,按照key指定顺序进行输出。其中实际上顺序就是key的值从小到大排序后的索引顺序。我这里就是用上述流程了,具体说明已经附在图例,请看注释。我没有重新建立二维数组来做,也可以考虑通过字符串,拆分成二维数组,再重新根据key的索引顺序再构建一个新的二维数组,再按顺序输出。这里就给定一种方法了哈,我这种方法就是对空间要求相对少,可能不一定直观,请参考:
参考代码如下
#include <iostream>
#include "Math.h"
using namespace std;
int main(){
char cl[1000] = {' '}, key[11] = {'\0'};
int col = 0, maxCharNum = 0, maxKeyNum = 0, keyIndex[10] = { 0 };;
//获取字符串并找到字符串的数量
cin >> noskipws;
do {
cin >> cl[col++];
} while (cl[col - 1] != '\n');
cl[col - 1] = ' ';//把换行替换成空格
maxCharNum = col-1;
//输入并寻找key的长度,并找到正确index顺序
cin >> key;
for (int i = 0; i < 11; i++) {
if (key[i] == '\0') {
maxKeyNum = i;
break;
}
}
for(int i=0;i<maxKeyNum;i++)
for(int j = 0; j < maxKeyNum; j++)
if ((key[j] - '0') == i){
keyIndex[i] = j;
break;
}
//每一个分组,其起点一定是key的长度的整数倍
for (int start = 0; start < maxCharNum; start += maxKeyNum) {
//在每组内进行循环,每行就是maxKeyNum个元素
for (int i = 0; i < maxKeyNum; i++) { //打印字符对应原字符串的位置:
col = start + keyIndex[i];
col > maxCharNum ? cout << ' ' : cout << cl[col];
}
}
}
2020-04-29
#include <iostream>
#include <string>
int main() {
std::string s, key;
getline(std::cin, s);
getline(std::cin, key);
int lenS = s.length();
int lenKey = key.length();
if (lenS % lenKey)
for (int i = 0; i < (lenKey - lenS % lenKey); i++)
s.append(" ");
lenS = s.length();
std::string tmp = s;
for (int i = 0; i < lenS ; i++)
tmp[key[i % lenKey] - '0' + lenKey * (i / lenKey)] = s[i];
std::cout << tmp << std::endl;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
void main()
{
string msg, key, result;
int keyl, msgl;
msg = "SEHH2042 Computer Programming is very EASY~!!";
key = "3596047218";
keyl = key.length();
msgl = msg.length();
int spaces = keyl - (msgl % keyl);
while(spaces--) msg.append(" ");
result = msg;
int pos = 0;
for(auto &i : msg) {
int tmp = key[pos % keyl] - '0' + (pos++ / keyl) * keyl;
result[tmp] = i;
}
cout << result << endl;
}