根據第二張圖中的過程解釋,可以理解加密過程:
首先,每n個字符構造壹個如圖所示的矩陣。按關鍵順序重新排序。最後合成並輸出壹個字符串。我這裏把這個問題看成是每n個字符壹組,所以不建二維數組,按照key指定的順序輸出。其實順序就是key的值從小到大排序後的索引順序。我這裏用的是上面的流程,具體說明已經附在圖例裏了。請看評論。我不是重新建立壹個二維數組來做的。我也可以考慮通過字符串拆分成二維數組,然後按照鍵的索引順序重新構造壹個新的二維數組,然後按順序輸出。這裏有壹個方法。我的方法需要的空間相對較小,可能不夠直觀。請參考:
參考代碼如下
# include & ltiostream & gt
#包含“Math.h”
使用命名空間std
int main(){
char cl[1000] = {' '},key[11]= { ' \ 0 ' };
int col = 0,maxCharNum = 0,maxKeyNum = 0,keyIndex[10]= { 0 };;
//獲取字符串,求出字符串的個數。
CIN & gt;& gtnoskipws
做{
CIN & gt;& gtcl[col++];
} while (cl[col - 1]!= ' \ n ');
cl[col-1]=“”;//用空格替換換行符
maxCharNum = col-1;
//輸入並查找鍵的長度,並找到正確的索引順序。
CIN & gt;& gt關鍵;
for(int I = 0;我& lt11;i++){
if(key[I]= = ' \ 0 '){
maxKeyNum = I;
打破;
}
}
for(int I = 0;我& ltmaxKeyNumi++)
for(int j = 0;j & ltmaxKeyNumj++)
if((key[j]--0 ')= = I){
keyIndex[I]= j;
打破;
}
//每個分組的起點必須是密鑰長度的整數倍。
for(int start = 0;開始& ltmaxCharNumstart+= maxKeyNum){
//在每個組中循環,每壹行都是maxKeyNum元素。
for(int I = 0;我& ltmaxKeyNumi++){//打印原字符串對應的字符位置:
col = start+keyIndex[I];
col & gtmaxCharNum?cout & lt& lt':cout & lt& ltcl[col];
}
}
}