1 条题解

  • 2
    @ 2022-11-25 14:22:46

    这道题代码不难,主要就if语句。 这里就讲解出明文的部分,即:

    if (cnow > know) ans += cnow - know + a;
    else if (cnow == know) ans += a;
    else ans += ('z' - know + 1) + (cnow - 'a') + a;
    

    可以看出我分成了3种情况:

    1.密文当前位>密钥当前位。

    这种情况说明没有开启新一轮(例xyzabcd属于开启了新一轮)直接cnow - know + a即可。

    2.密文当前位=密钥当前位。 哪个字母与任意一个字母进行R运算还等于那个字母呢?那就只有A了。因此ans += a。

    3.密文当前位<密钥当前位。 这种比较复杂,因为它开启了新一轮,所以我把它分成了2部分,前一轮(即……z)与后一轮(即a……),分别为('z' - know + 1)与(cnow - 'a'),最后求和即可。 上完整代码:

    #include <bits/stdc++.h>
    using namespace std;
    /*
    k为密钥
    c为密文
    cpos存储c当前下标
    kpos存储k当前下标
    a存储字母模式(大小写)
    know存储k当前值
    cnow存储c当前值
    */
    int main()
    {
        string k , c , ans;
        int kpos = 0;
        cin >> k >> c;
        for (int cpos = 0 ; cpos < c.length() ; cpos++)
        { 
            //将know与cnow统一成一种模式
            char a = 'a' , know = k[kpos] - 'A' + 'a' , cnow = c[cpos] - 'A' + 'a';
            if (k[kpos] >= 'a' && k[kpos] <= 'z') know = k[kpos];
            if (c[cpos] >= 'a' && c[cpos] <= 'z') cnow = c[cpos];
            //判断此位模式
            if (c[cpos] >= 'A' && c[cpos] <= 'Z') a = 'A';
            //解出此位
            if (cnow > know) ans += cnow - know + a;
            else if (cnow == know) ans += a;
            else ans += ('z' - know + 1) + (cnow - 'a') + a;
            //k下标变化
            kpos++;
            kpos %= k.length();
        }
        cout << ans;
        return 0;
    }
    
    • 1

    [普及][NOIP2012 提高组] Vigenère 密码

    信息

    ID
    1485
    时间
    1000ms
    内存
    128MiB
    难度
    1
    标签
    递交数
    42
    已通过
    31
    上传者