C++ 如何打乱一个数组顺序,并可以复原?

char str[]="abcdefg123456789";
char key[]="8635";

比如通过key的值作为密钥,将str数组中顺序给打乱,然后可以再次通过key来把打乱的数组复原?

#include<iostream>
using namespace std;
int main()
{
char str[]="abcdefg123456789";
char key[]="8635";
char temp;
/*利用秘钥乱序*/
for(int j = 0; j < 2; j++)   //对于key的前两位
for(int i = 0;(i+(key[j]-'0'))<=16; i++)
{
if(i%2!=0)//奇数位与其后面第key[j]位交换
{
temp = str[i+(key[j]-'0')];
str[i+(key[j]-'0')] = str[i];
str[i] = temp;
}
}
for(int i = 0; i < 16; i++)
cout<<str[i]<<" ";
cout<<endl;
for(int j = 2; j < 4; j++)    //对于key的后两位
for(int i = 0;(i+(key[j]-'0'))<=16; i++)
{
if(i%2==0)//偶数位与其后面第key[j]位交换
{
temp = str[i+(key[j]-'0')];
str[i+(key[j]-'0')] = str[i];
str[i] = temp;
}
}
for(int i = 0; i < 16; i++)
cout<<str[i]<<" ";
cout<<endl;

/*利用秘钥复原*/
for(int j = 3; j >= 2; j--)    //对于key的后两位
for(int i = 16;(i-(key[j]-'0'))>=0; i--)
{
if(i%2!=0)//奇数位与其前面第key[j]位交换
{
temp = str[i-(key[j]-'0')];
str[i-(key[j]-'0')] = str[i];
str[i] = temp;
}
}
for(int i = 0; i < 16; i++)
cout<<str[i]<<" ";
cout<<endl;

for(int j = 1; j >= 0; j--)   //对于key的前两位
for(int i = 16;(i-(key[j]-'0'))>=0; i--)
{
if(i%2!=0)//奇数位与其前面第key[j]位交换
{
temp = str[i-(key[j]-'0')];
str[i-(key[j]-'0')] = str[i];
str[i] = temp;
}
}
for(int i = 0; i < 16; i++)
cout<<str[i]<<" ";
system("pause");
return 0;
}

我写了个,你看符合不

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-04-06
数组里面存的是 已经排好顺序的数?
打乱顺序: 搞一个随机函数,生成两个数, 把对应数组下标的数 交换,做N次,次序就乱了。

复原: 用排序算法排序一下就可以了。(如果有相等的数,那就比较麻烦,即使用稳定的排序算法,也还原不回去了)本回答被网友采纳
第2个回答  2015-10-07
用随机数, 产生一个打乱序列A.
再生成A这个乱序的逆序数列B.
然后你先把这个数列按照A打乱.
要恢复时再用B逆运算一下就行了.
第3个回答  2014-06-17
请说明清楚这个乱序是什么要求? 你给的key在其中使用的方式。。。
是排序的依据 还是什么的。
如果是要加密 那么异或就可以解决
如果是通过key排序 先给定变化方式 然后记录变化路径就可以了
第4个回答  2014-06-17
运用某些加密算法就可以,比如很著名的RC4,在百度百科就有详细的介绍。
相似回答