C++ 编程,编写一个程序,通过根据输入键重新排列输入字符串中的字符来加密用户输入消息,求代码

编写一个程序,通过根据输入键重新排列输入字符串中的字符来加密用户输入消息(少于1000个字符)。键包含n个(最多10个)连续整数(范围从0到n-1),这些整数指示重新排列... 编写一个程序,通过根据输入键重新排列输入字符串中的字符来加密用户输入消息(少于1000个字符)。键包含n个(最多10个)连续整数(范围从0到n-1),这些整数指示重新排列的位置。请注意,输入键可以以0开头。
过程说明
消息:SEHH2042 Computer Programming is very EASY~!!
钥匙:3596047218
加密:
首先,每隔n个字符(n是键长)中断消息,并将其排列成行。每行有n个字符。最后几个空插槽中充满了空格。然后根据键,将列重新排列到新的列位置,即,将第0列放到第3列,将第1列放到第5列,将第2列放到第9列,依此类推…
最后,合并行以获取下面的加密文本。
加密:2 2S0EH4CHtP oemurrpmgnomgai reE irsvyA ! S Y! ~
如图所示。内容以英文为准。
展开
 我来答
百度网友63b0960
2020-04-29 · TA获得超过1469个赞
知道小有建树答主
回答量:661
采纳率:90%
帮助的人:213万
展开全部

谢邀。

根据第二张图中的过程解释,可以对加密过程进行理解:

首先,每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;

}

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Ma_se
2020-04-29 · TA获得超过328个赞
知道小有建树答主
回答量:403
采纳率:75%
帮助的人:109万
展开全部
#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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式