凯撒密码一道关于C语言的题

TU是一个非常不喜欢冒险非常讨厌挑战的人,有一天他接到一个来自上级Home_W的任务,要求是让他把一串字符串解密,解密方法是每个位置上的字符向左位移2^(i%30)次(i表示在字符串中的下标i(i从0开始)),且A向左移是B, Z向左移是a, z向左移是A,这个字符串的解密很有意思,然而TU嫌写代码麻烦就把问题甩给了你们,你们能很快帮他写出解密程序吗?

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;
}

哪里的题 我去提一下