由题目要求可知 题目要求先创建一个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++二维数组螺旋加密信息的文章就介绍到这了,更多相关C++二维数组螺旋加密内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!