TU是一个非常不喜欢冒险非常讨厌挑战的人,有一天他接到一个来自上级Home_W的任务,要求是让他把一串字符串解密,解密方法是每个位置上的字符向左位移2^(i%30)次(i表示在字符串中的下标i(i从0开始)),且A向左移是B, Z向左移是a, z向左移是A,这个字符串的解密很有意思,然而T
U嫌写代码麻烦就把问题甩给了你们,你们能很快帮他写出解密程序吗?
Input
输入多组数据 请处理到文件结束
每一行输入一个加密字符串str, str的长度小于1000000, 保证没有空格等多余字符出现在字符串内。
Output
输出解密以后的字符串,每个字符串占一行
SampleInput
vc
Zpa
ehqlKwaGv
SampleOutput
we
are
fjutacmer
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int sa = 97, sA = 65, sz = 122, sZ = 90;
int azAz(int n)
{
while (n > sZ && n < sa || n > sz)
{
if (n > sz)
{
n -= sz - sA - 1;
}
else
{
n += sa - sZ - 1;
}
}
return n;
}
int main()
{
int N = 30;
int a[N];
int num = 52, n;
for (int i = 0; i < N; i++)
{
int temp = pow(2, i);
if (temp < num)
{
a[i] = temp;
}
else
{
n = i;
break;
}
}
for (int i = n; i < N; i++)
{
int temp = a[i - 1] * 2;
a[i] = temp % num;
}
string str;
while(cin>>str)
{
int slen = str.length();
for (int i = 0; i < slen; i++)
{
int temp = (int)str[i];
temp += a[i % N];
temp = azAz(temp);
str[i] = (char)temp;
}
cout<<str<<endl;
}
return 0;
}
哪里的题 我去提一下