C++二维数组螺旋加密信息

 更新时间:2021年12月31日 14:40:56   作者:Stupefy.  
大家好,本篇文章主要讲的是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++二维数组螺旋加密信息的文章就介绍到这了,更多相关C++二维数组螺旋加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • VS中的scanf_s函数和scanf用法及说明

    VS中的scanf_s函数和scanf用法及说明

    这篇文章主要介绍了VS中的scanf_s函数和scanf用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言植物大战数据结构希尔排序算法

    C语言植物大战数据结构希尔排序算法

    这篇文章主要为大家介绍了C语言希尔排序算法实现植物大战示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C语言动态内存管理的原理及实现方法

    C语言动态内存管理的原理及实现方法

    C语言动态内存管理的原理是通过 malloc() 函数申请一块连续的内存空间,并返回其地址,通过 free() 函数释放该内存空间。实现方法是通过在程序运行时动态地管理内存,即在需要内存时申请,不需要时释放,避免了静态内存分配的浪费和不足
    2023-04-04
  • C语言动态链表实现学生学籍管理系统

    C语言动态链表实现学生学籍管理系统

    这篇文章主要为大家详细介绍了C语言动态链表实现学生学籍管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • C++实现list增删查改模拟的示例代码

    C++实现list增删查改模拟的示例代码

    本文主要介绍了C++实现list增删查改模拟,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • C++获取文件大小的4种常见技巧分享

    C++获取文件大小的4种常见技巧分享

    这篇文章主要介绍了C++获取文件大小的4种常见技巧分享,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • C++控制台实现俄罗斯方块游戏

    C++控制台实现俄罗斯方块游戏

    这篇文章主要为大家详细介绍了C++控制台实现俄罗斯方块游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • C语言中建立和删除文件连接的相关函数讲解

    C语言中建立和删除文件连接的相关函数讲解

    这篇文章主要介绍了C语言中建立和删除文件连接的相关函数讲解,分别为link和unlink函数的使用,需要的朋友可以参考下
    2015-09-09
  • C++ opencv ffmpeg图片序列化实现代码解析

    C++ opencv ffmpeg图片序列化实现代码解析

    这篇文章主要介绍了C++ opencv ffmpeg图片序列化实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 实例代码讲解c++ 继承特性

    实例代码讲解c++ 继承特性

    这篇文章主要介绍了c++ 继承特性的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07

最新评论