7-1 数组循环左移 (20 分)

时间: 2023-11-27 07:06:01 浏览: 85
这个问题是一个编程题目,要求实现一个将数组循环左移k位的函数。 具体实现方法可以是:先将前k个数字翻转,再将后面的数字翻转,最后将整个数组翻转。 以下是一个C++的实现示例: ```cpp void reverse(int nums[], int start, int end) { while (start < end) { int temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; start++; end--; } } void rotate(int nums[], int n, int k) { k = k % n; reverse(nums, 0, k - 1); reverse(nums, k, n - 1); reverse(nums, 0, n - 1); } ``` 其中,reverse函数用于翻转数组中的一段区间,rotate函数用于实现数组循环左移。
相关问题

7-2 数组循环左移(20分)(顺序表实现)

题目描述: 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移M(M>=0)个位置,即将A中的数据由(A0 A1……AN-1)变换为(AM AM+1……AN-1 A0 A1……AM-1)(最前面的M个数变为最后面的M个数,其它依次向前推),试编写程序实现上述功能,对于给定的一个数组A及其长度N,输出循环左移M位后的结果。 输入格式: 输入第1行给出正整数N(1≤N≤100)、正整数M(≤N)和一个数组A(A0 A1……AN-1),其中每个整数都在[-1000, 1000]之间。 输出格式: 在一行中输出循环左移M位后的数组A的内容,数字间以空格分隔,行末不得有多余空格。 输入样例: 6 2 1 2 3 4 5 6 输出样例: 3 4 5 6 1 2 解题思路: 可以用顺序表来实现。首先将前M个数逆序,将后N-M个数逆序,再将整个数组逆序即可。 C++代码实现: ```cpp #include <iostream> #include <vector> using namespace std; int main() { int n, m; cin >> n >> m; vector<int> v(n); for (int i = 0; i < n; i ++ ) cin >> v[i]; reverse(v.begin(), v.begin() + m); reverse(v.begin() + m, v.end()); reverse(v.begin(), v.end()); for (int i = 0; i < n; i ++ ) cout << v[i] << (i == n - 1 ? "\n" : " "); return 0; } ```

masm汇编语言实现 将一个指定字符串进行循环移位加密。每个单字符的密钥(-7~7)保存在数组Key中。程序运行过程:显示明文,显示所产生的密文,显示解密后的明文。例如key = {-2,2,1,0,-1},其中负数表示循环左移,正数表示循环右移,0不变,数字表示移动的位数。 模板 DATAS SEGMENT ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX ;此处输入代码段代码 MOV AH,4CH INT 21H CODES ENDS END START

以下是使用 MASM 汇编语言实现将指定字符串进行循环移位加密的代码,包括显示明文、密文和解密后的明文: ``` DATAS SEGMENT ; 数据段定义 MAX_LEN EQU 100 ; 字符串最大长度 STR DB MAX_LEN DUP(?) ; 存储明文、密文和解密后的明文的字符串 KEY DB -2, 2, 1, 0, -1 ; 密钥数组 DATAS ENDS STACKS SEGMENT ; 堆栈段定义 DW 100H DUP(?) ; 申请堆栈空间 STACKS ENDS CODES SEGMENT ASSUME CS:CODES, DS:DATAS, SS:STACKS START: ; 初始化堆栈指针 MOV AX, STACKS MOV SS, AX ; 显示提示信息 MOV DX, OFFSET STR MOV AH, 9 MOV DL, "P" INT 21H MOV DL, "l" INT 21H MOV DL, "e" INT 21H MOV DL, "a" INT 21H MOV DL, "s" INT 21H MOV DL, "e" INT 21H MOV DL, " " INT 21H MOV DL, "i" INT 21H MOV DL, "n" INT 21H MOV DL, "p" INT 21H MOV DL, "u" INT 21H MOV DL, "t" INT 21H MOV DL, " " INT 21H MOV DL, "s" INT 21H MOV DL, "t" INT 21H MOV DL, "r" INT 21H MOV DL, "i" INT 21H MOV DL, "n" INT 21H MOV DL, "g" INT 21H MOV DL, ":" INT 21H ; 读入明文字符串 MOV AH, 0AH MOV DX, OFFSET STR INT 21H ; 显示明文 MOV AH, 9 MOV DX, OFFSET STR+2 INT 21H ; 加密 MOV SI, OFFSET STR+2 ; SI 指向明文 MOV DI, OFFSET STR+MAX_LEN+2 ; DI 指向密文 MOV CX, 0 ; CX 计数器清零 MOV BX, 0 ; BX 存储密钥数组的偏移量 ENCRYPT_LOOP: MOV AL, [SI] ; 取出当前字符 ADD AL, [KEY+BX] ; 加上密钥 CMP AL, 0 ; 判断是否为 0 JZ ENCRYPT_SKIP ; 如果为 0,则不变 CMP AL, 7 ; 判断是否大于 7 JG ENCRYPT_OVERFLOW ; 如果大于 7,则溢出 CMP AL, -7 ; 判断是否小于 -7 JL ENCRYPT_OVERFLOW ; 如果小于 -7,则溢出 ADD BX, 1 ; 更新密钥数组的偏移量 CMP BX, 5 ; 判断是否超出密钥数组的长度 JGE ENCRYPT_RESET ; 如果超出,则重置为 0 CMP AL, 0 ; 判断是否为 0 JZ ENCRYPT_SKIP ; 如果为 0,则不变 CMP AL, 0AH ; 判断是否为换行符 JE ENCRYPT_SKIP ; 如果是换行符,则不变 CMP AL, 0DH ; 判断是否为回车符 JE ENCRYPT_SKIP ; 如果是回车符,则不变 ADD [DI], AL ; 更新密文 CMP [DI], 7FH ; 判断是否超出 ASCII 码表范围 JG ENCRYPT_OVERFLOW ; 如果超出,则溢出 CMP [DI], 20H ; 判断是否小于空格 JL ENCRYPT_OVERFLOW ; 如果小于空格,则溢出 ENCRYPT_SKIP: INC SI ; 指向下一个字符 INC DI ; 指向下一个密文 INC CX ; 计数器加 1 CMP CX, MAX_LEN ; 判断是否超出字符串最大长度 JG ENCRYPT_END ; 如果超出,则结束加密 JMP ENCRYPT_LOOP ENCRYPT_OVERFLOW: ; 显示错误信息 MOV DX, OFFSET STR MOV AH, 9 MOV DL, "E" INT 21H MOV DL, "r" INT 21H MOV DL, "r" INT 21H MOV DL, "o" INT 21H MOV DL, "r" INT 21H MOV DL, "!" INT 21H JMP ENCRYPT_END ENCRYPT_RESET: ; 重置密钥数组的偏移量为 0 XOR BX, BX JMP ENCRYPT_LOOP ENCRYPT_END: ; 显示密文 MOV AH, 9 MOV DX, OFFSET STR+MAX_LEN+2 INT 21H ; 解密 MOV SI, OFFSET STR+MAX_LEN+2 ; SI 指向密文 MOV DI, OFFSET STR+MAX_LEN*2+2 ; DI 指向解密后的明文 MOV CX, 0 ; CX 计数器清零 MOV BX, 0 ; BX 存储密钥数组的偏移量 DECRYPT_LOOP: MOV AL, [SI] ; 取出当前字符 SUB AL, [KEY+BX] ; 减去密钥 CMP AL, 0 ; 判断是否为 0 JZ DECRYPT_SKIP ; 如果为 0,则不变 CMP AL, 7 ; 判断是否大于 7 JG DECRYPT_OVERFLOW ; 如果大于 7,则溢出 CMP AL, -7 ; 判断是否小于 -7 JL DECRYPT_OVERFLOW ; 如果小于 -7,则溢出 ADD BX, 1 ; 更新密钥数组的偏移量 CMP BX, 5 ; 判断是否超出密钥数组的长度 JGE DECRYPT_RESET ; 如果超出,则重置为 0 CMP AL, 0 ; 判断是否为 0 JZ DECRYPT_SKIP ; 如果为 0,则不变 CMP AL, 0AH ; 判断是否为换行符 JE DECRYPT_SKIP ; 如果是换行符,则不变 CMP AL, 0DH ; 判断是否为回车符 JE DECRYPT_SKIP ; 如果是回车符,则不变 ADD [DI], AL ; 更新解密后的明文 CMP [DI], 7FH ; 判断是否超出 ASCII 码表范围 JG DECRYPT_OVERFLOW ; 如果超出,则溢出 CMP [DI], 20H ; 判断是否小于空格 JL DECRYPT_OVERFLOW ; 如果小于空格,则溢出 DECRYPT_SKIP: INC SI ; 指向下一个密文 INC DI ; 指向下一个解密后的明文 INC CX ; 计数器加 1 CMP CX, MAX_LEN ; 判断是否超出字符串最大长度 JG DECRYPT_END ; 如果超出,则结束解密 JMP DECRYPT_LOOP DECRYPT_OVERFLOW: ; 显示错误信息 MOV DX, OFFSET STR MOV AH, 9 MOV DL, "E" INT 21H MOV DL, "r" INT 21H MOV DL, "r" INT 21H MOV DL, "o" INT 21H MOV DL, "r" INT 21H MOV DL, "!" INT 21H JMP DECRYPT_END DECRYPT_RESET: ; 重置密钥数组的偏移量为 0 XOR BX, BX JMP DECRYPT_LOOP DECRYPT_END: ; 显示解密后的明文 MOV AH, 9 MOV DX, OFFSET STR+MAX_LEN*2+2 INT 21H ; 退出程序 MOV AH, 4CH INT 21H CODES ENDS END START ```

相关推荐

最新推荐

recommend-type

HTML+CSS制作的个人博客网页.zip

如标题所述,内有详细说明
recommend-type

基于MATLAB实现的SVC PSR 光谱数据的读入,光谱平滑,光谱重采样,文件批处理;+使用说明文档.rar

CSDN IT狂飙上传的代码均可运行,功能ok的情况下才上传的,直接替换数据即可使用,小白也能轻松上手 【资源说明】 基于MATLAB实现的SVC PSR 光谱数据的读入,光谱平滑,光谱重采样,文件批处理;+使用说明文档.rar 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2020b;若运行有误,根据提示GPT修改;若不会,私信博主(问题描述要详细); 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可后台私信博主; 4.1 期刊或参考文献复现 4.2 Matlab程序定制 4.3 科研合作 功率谱估计: 故障诊断分析: 雷达通信:雷达LFM、MIMO、成像、定位、干扰、检测、信号分析、脉冲压缩 滤波估计:SOC估计 目标定位:WSN定位、滤波跟踪、目标定位 生物电信号:肌电信号EMG、脑电信号EEG、心电信号ECG 通信系统:DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪、数字信号调制、误码率、信号估计、DTMF、信号检测识别融合、LEACH协议、信号检测、水声通信 5、欢迎下载,沟通交流,互相学习,共同进步!
recommend-type

基于MATLAB实现的有限差分法实验报告用MATLAB中的有限差分法计算槽内电位+使用说明文档

CSDN IT狂飙上传的代码均可运行,功能ok的情况下才上传的,直接替换数据即可使用,小白也能轻松上手 【资源说明】 基于MATLAB实现的有限差分法实验报告用MATLAB中的有限差分法计算槽内电位;对比解析法和数值法的异同点;选取一点,绘制收敛曲线;总的三维电位图+使用说明文档 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2020b;若运行有误,根据提示GPT修改;若不会,私信博主(问题描述要详细); 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可后台私信博主; 4.1 期刊或参考文献复现 4.2 Matlab程序定制 4.3 科研合作 功率谱估计: 故障诊断分析: 雷达通信:雷达LFM、MIMO、成像、定位、干扰、检测、信号分析、脉冲压缩 滤波估计:SOC估计 目标定位:WSN定位、滤波跟踪、目标定位 生物电信号:肌电信号EMG、脑电信号EEG、心电信号ECG 通信系统:DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪、数字信号调制、误码率、信号估计、DTMF、信号检测识别融合、LEACH协议、信号检测、水声通信 5、欢迎下载,沟通交流,互相学习,共同进步!
recommend-type

gara.ttf,字体下载

gara.ttf字体下载
recommend-type

Java_Termux是Android操作系统的终端仿真应用程序,可通过各种包进行扩展.zip

Java_Termux是Android操作系统的终端仿真应用程序,可通过各种包进行扩展
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【实战演练】MATLAB用遗传算法改进粒子群GA-PSO算法

![MATLAB智能算法合集](https://static.fuxi.netease.com/fuxi-official/web/20221101/83f465753fd49c41536a5640367d4340.jpg) # 2.1 遗传算法的原理和实现 遗传算法(GA)是一种受生物进化过程启发的优化算法。它通过模拟自然选择和遗传机制来搜索最优解。 **2.1.1 遗传算法的编码和解码** 编码是将问题空间中的解表示为二进制字符串或其他数据结构的过程。解码是将编码的解转换为问题空间中的实际解的过程。常见的编码方法包括二进制编码、实数编码和树形编码。 **2.1.2 遗传算法的交叉和
recommend-type

openstack的20种接口有哪些

以下是OpenStack的20种API接口: 1. Identity (Keystone) API 2. Compute (Nova) API 3. Networking (Neutron) API 4. Block Storage (Cinder) API 5. Object Storage (Swift) API 6. Image (Glance) API 7. Telemetry (Ceilometer) API 8. Orchestration (Heat) API 9. Database (Trove) API 10. Bare Metal (Ironic) API 11. DNS
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。