解题思路:
说白了就是把密匙中的a/A变成0,b/B变成1......这样的,我们要得的明文就是密文对应的字符减去该字符对应的密匙字符的数字,需要注意的是a-1不是变成阿斯克码等于96的字符,而是z,A同理,其他的字符也同理。
人狠话不多,上代码:
#include#include using namespace std; string s1, s2; int ex[105]; int main() { cin >> s1 >> s2; int i, o = 0; for (i = 0; i < s1.size(); ++i) { if (s1[i] >= 'a' && s1[i] <= 'z') ex[i] = s1[i] - 97; else ex[i] = s1[i] - 65; } for (i = 0; i < s2.size(); ++i) { if (s2[i] >= 'a') { if (s2[i] - ex[o] >= 'a') s2[i] -= ex[o++]; else s2[i] = 'a' + 25 - (ex[o++] - (s2[i] - 'a')) + 1; } else if (s2[i] >= 'A' && s2[i] <= 'Z') { if (s2[i] - ex[o] >= 'A') s2[i] -= ex[o++]; else s2[i] = 'A' + 25 - (ex[o++] - (s2[i] - 'A')) + 1; } if (o == s1.size()) o = 0; } cout << s2; return 0; }


![每日五练---P1079 [NOIP2012 提高组] Vigenère 密码 每日五练---P1079 [NOIP2012 提高组] Vigenère 密码](http://www.mshxw.com/aiimages/31/714144.png)
