我正在尝试进行换位密码,问题如下。
用户给出一个没有空格的字符串。让我们说string = thisisamessage
。
然后用户给出名为b
的块大小,让我们说b = 5
;
然后,用户提供密钥,该密钥是从1
到块大小b
(在这种情况下为5
)的唯一数字的数字。所以我们说32154
。
回顾:
text = thisisamessage
block number b = 5
key = 32154
根据b
分隔字符串
在这种情况下,五个,但最后一部分只有4个字符,这是我遇到问题的部分。
12345 | 12345 | 1234
thisi | sames | sage
32154 | 32154 | 3214
ihtis | masse | gase
基本上取决于键我需要做的事情就是说第一个键号是3然后第3个字母将成为第一个字母this
,第三个字母是i
所以{{1先行,然后第二个键号是2,所以i
接下来等等。直到最后一个块,我有问题。在这种情况下,在第5个块中只剩下4个字母,并且对于每个块,键再次开始。但是例如,如上所述,我没有任何与5对应的字符,所以我需要删除5个,但仍然保持h
成为32154
的顺序,这样我就可以更改下一个字母。< / p>
我该怎么做?如果您需要我的代码,请告诉我。
堆栈和其他网站上的其他答案与我的问题类似。
答案 0 :(得分:0)
我可以提供这个解决方案。函数参数的验证没有。
#include <iostream>
#include <string>
typedef unsigned int uint;
std::string simpletransform(
const std::string &line,
const std::string &key,
const uint number);
int main()
{
std::string line="thisisamessage";
uint number = 5;
std::string key = "32154";
std::cout<<simpletransform(line,key,number)<<std::endl;
return 0;
}
std::string simpletransform(
const std::string &line,
const std::string &key,
const uint number)
{
std::string resultstr;
std::string substr;
size_t N = line.size()%number;
size_t i=0;
for(size_t j=0;i<N-number;i++,j++)
{
if(i%number==0)
{
substr = line.substr(i,number);
j=0;
if(substr.size()!=number) break;
}
auto temp = static_cast<uint>(key[j])-49;
resultstr += substr[temp];
}
i=0;
for(size_t count =0;count!=number;count++)
{
auto p = static_cast<uint>(key[count])-49;
if(p>=N)
continue;
resultstr += substr[p];
}
return resultstr;
}