7-1 数组循环左移 (20 分)
时间: 2023-11-27 13:06:01 浏览: 146
这个问题是一个编程题目,要求实现一个将数组循环左移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
```
阅读全文