您好,登錄后才能下訂單哦!
小編給大家分享一下C++如何實現二維數組螺旋加密信息,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
由題目要求可知 題目要求先創建一個r行c列的矩陣
然后輸入一串字符串 字符串長度肯定小于r*c/5
由A C M的表示方式可以看出每個字符由5位的二進制位系統表示(無符號位)
那么我們首先可以先創建一個字符串類型
string a; cin>>a;
rt 字母表示它是26字母表中第幾個字母
很多人第一時間想用數組11對應 或者switch語句選擇
但轉念一想就知道太麻煩了 所以這里用字符的ASCII碼減去64來表示它的數字形式
轉ASCII碼都知道 強類型轉換
由于不止一個字符 為了提高代碼的復用性 我們專門寫個函數來返回字母的數字形式的二進制值
int bit(char a) //定義一個將字母轉換為二進制數的函數 返回二進制數 { int num=int(a)-64; int result = 0, j = 1; while(num){ result = result + j * (num % 2); num = num / 2; j = j * 10; } return result; }
二進制值有了 還得確保每個字母都能轉換為5位的二進制系統
故在循環之中再套循環 像00011這種啥數據類型都不是的玩意兒 最好直接給它套數組里去 所以我們先定義個數組
然后按流程把1和0放進去 并通過while循環補全0
for(int count0=0;count0<a.size();count0++) { int Tbits=bit(a[count0]); //得到二進制數 digits=judge(Tbits); //判斷位數 將5位2進制數補全0 times=digits-1; //獲取位數 //從而將二進制數各個位數上的數字準確的填入數組 while(digits!=5) { arr[s]=0; digits++; s++; } while(Tbits!=0) { d=Tbits%10; // 從最小位數開始 arr[s+times]=d; Tbits/=10; times--; } s=5*(count0+1); //每個數都是5位 故讓每循環完一個字母讓索引+5 }
這時我就達到了把每個5位二進制位系統的值都放進數組里去
但是根據題意可知 有空缺的地方 需要用0填充 故寫個for循環將剩下的空用0填充
for(int count1=a.size()*5;count1<(r*c);count1++) { arr[count1]=0; //將剩余的位置用0填充 }
重頭戲來了
如何螺旋式將這個數組的每個數填到二維數組中去呢?
根據題意可知 填充方向是右下左上
故思路是:
先填充第一行 再填充最后一列 再填充最后一行 再填充第一列
填充完第一行 起始行變量+1
填充完最后一列 末列變量-1
填充完最后一行 末行變量-1
填充完第一列 起始列變量+1
代碼如下:
int iStart=0,iEnd=r-1,jStart=0,jEnd=c-1,times1=0,i,j; while(iEnd>=iStart&&jEnd>=jStart){ //上面的行 for(j=jStart;j<=jEnd;j++){ array[iStart][j]=arr[times1]; times1++; } iStart++; //右邊的列 for(i=iStart;i<=iEnd;i++){ array[i][jEnd]=arr[times1]; times1++; } jEnd--; //下面的行 if(iEnd>=iStart){ for(j=jEnd;j>=jStart;j--){ array[iEnd][j]=arr[times1]; times1++; } iEnd--; } //左邊的列 if(jEnd>=jStart){ for(i=iEnd;i>=iStart;i--){ array[i][jStart]=arr[times1]; times1++; } jStart++; } }
根據題意 還有一個大坑 這個惡心的出題人讓我們正常打印 即第一行 第二行 第三行....
真是處處都是坑
故直接一個嵌套for循環
for(i=0;i<r;i++){ for(j=0;j<c;j++){ cout<<array[i][j]; } } }
看完了這篇文章,相信你對“C++如何實現二維數組螺旋加密信息”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。