#include <iostream>
using namespace std;
int main() {
string k,c;
cin>>k>>c;
for (int i=0;i<c.length();i++)
{
int t=(k[i%k.length()]&31)-1;
c[i]=(c[i]&31)-t>0?c[i]-t:c[i]-t+26;
}
cout<<c<<endl;
return 0;
}
uj5u.com熱心網友回復:
26字母回圈啊。uj5u.com熱心網友回復:
如果有數學基礎就好理解cin>>k>>c; //輸入密鑰,密文
for (int i=0;i<c.length();i++) //按照密文的長度回圈一個一個取出密文的字符計算
{
int t=(k[i%k.length()]&31)-1; //密文當前位置對應的密鑰字符,也就是密文c[i]這個i位置對應密鑰的i位置,
//因為(明文)密文可能比密鑰長,而已知密鑰可回圈使用,所以 i 位置超出k的長度后又從0位置開始,
//所以就是 i%k.length()
//至于&31處理,其實和%32處理是等價的(為啥等價自己用二進制推算,這里不細說了),
//而大小寫字母剛好相差32,即 'a'和'A'的ascii碼剛好相差32,所以%32的結果大小寫字母是一樣的
//而且k[i]%32剛好得到字符對應的位置,
//比如'a'%32=1('A'%32=1),這就相當于能拿到字母a對應的位置(位置從0開始,所以-1)
c[i]=(c[i]&31)-t>0?c[i]-t:c[i]-t+26; //c[i]%32和上面說的一樣就是c[i]這個字符對應的位置,-t 就計算和k[i]位置的相對距離
//如果相對距離大于0則取c[i]-t為明文的字符(明文:行+密鑰:列=密文,反過來就是明文=密文-密鑰)
//就好比例子中 密文'H'%32-(密鑰'a'%32-1)=明文'H')
//如果距離小于0,則結果再加上26(相當于字母多輪一圈轉回來)
}
cout<<c<<endl; //輸出結果
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/71284.html
標籤:C++ 語言
下一篇:人臉識別
