Re: [課業] 密碼學作業
※ 引述《lobaka (愛撒嬌的貓)》之銘言:
: #include<iostream>
: #include<fstream>
: using namespace std;
: char cipher(char key,char original)//轉換函式 參數key,明文字元
: {
: char transfer; //輸出用
: int numkey; //暫存由ASCII轉換後的數字
直接比對他都會幫你很nice的轉好
: numkey = key - 97; //小寫a的ASCII碼是97
: if(original + numkey < 122) //這邊很重要!!由於ASCII碼只定義到127
: { //若是超過的不會被當作ASCII處理的樣子
: //確切原因博元不知道
: //不過大家可以試試看先把他加到超過127
: //在減回來,應該是轉不回來
: transfer = original + numkey;//密文=原文+key的ASCII碼-97
: //不懂為啥的去翻課本
: }
: else
: {
: transfer = original - 26 + numkey; //如果加到超過z則-26回頭
: }
: return transfer; //回傳密文
: }
我的加密是這樣寫...
cryp[] 原文 , temp[] 輸入的key+原文(和原文等長)
for(int j=0 ; j<cryp.length() ; j++)
{
int add = int(cryp[j]-97) + temp[j]-97; //a=0,...,z=25
cryp[j] = add % 26 + 97; //轉成英文
}
這時候的回傳cryp[] , 就是加密完成的
然後丟進二維陣列的方式有很多
甚至你可以不要丟,用個 index 跑來跑去也可以
1.跑7 * row //row是總密文字數/7 (要判斷啥時要加1喔 %7 > 0時)
2.一個一個丟進去 從[0][0]開始,丟到完這樣
輸出部分,要根據你輸入的key2 ,7位數字順序一行一行輸出
for(int i=0;i<7;i++)
{
int var = key2[i]-1; //key2: 7位數字 (1~7不重複)
for(int j=0;j<row;j++) //text[7][row]是剛丟完的2維陣列
{
if(text[var][j] < 97 || text[var][j] > 122)
//如果不是英文,遇到空白或是結束
break;
else
{
cout<<text[var][j]; //輸出爽的
fout<<text[var][j]; //丟到檔案
}
}
}
--END--
--
※ 編輯: jerry771210 來自: 140.112.25.183 (03/29 10:59)
討論串 (同標題文章)