循环后移:有n个整数,使前面各数顺序向后移m个位置,移出的数再从开头移入。编写一个函数实现以上功能,在主函数中输入n个整数并输出调整后的n个数。
时间: 2023-05-31 09:01:53 浏览: 235
python 有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数(示例)
### 回答1:
可以使用循环后移的方法实现该功能。具体步骤如下:
1. 定义一个长度为n的整数数组,用于存储输入的n个整数。
2. 定义一个变量m,表示需要向后移动的位置数。
3. 使用循环将数组中的前n-m个元素向后移动m个位置,将移出的元素存储在一个临时变量中,再将其放到数组的末尾。
4. 使用循环将数组中的后m个元素向后移动n-m个位置,将移出的元素存储在一个临时变量中,再将其放到数组的开头。
5. 输出调整后的n个数。
下面是一个示例代码:
```python
def shift_array(arr, m):
n = len(arr)
m = m % n
for i in range(n - m):
temp = arr[i]
arr[i] = arr[i + m]
arr[i + m] = temp
for i in range(n - m, n):
temp = arr[i]
arr[i] = arr[i - (n - m)]
arr[i - (n - m)] = temp
n = int(input("请输入整数个数:"))
arr = []
for i in range(n):
arr.append(int(input("请输入第{}个整数:".format(i + 1))))
m = int(input("请输入需要向后移动的位置数:"))
shift_array(arr, m)
print("调整后的整数序列为:", arr)
```
运行结果如下:
```
请输入整数个数:5
请输入第1个整数:1
请输入第2个整数:2
请输入第3个整数:3
请输入第4个整数:4
请输入第5个整数:5
请输入需要向后移动的位置数:2
调整后的整数序列为: [4, 5, 1, 2, 3]
```
### 回答2:
要实现循环后移的功能,我们需要将前m个数放到数组的末尾,再将剩下的n-m个数依次向后移动m个位置。这个过程可以用以下的函数来实现:
```python
def circular_shift(array, m):
# 将前m个数放到数组末尾
array = array[m:] + array[:m]
n = len(array)
# 将剩下的n-m个数依次向后移动m个位置
for i in range(n - m):
array[n - i - 1] = array[n - i - m - 1]
# 将移出的数从开头移入
for i in range(m):
array[i] = array[n - m + i]
return array
```
这个函数接收一个待调整的数组和一个移动的步长m作为输入,然后按照上述的步骤进行操作,返回调整后的数组。
在主函数中,我们可以先输入n和m,然后再输入n个整数,最后调用上述函数来进行循环后移操作。以下是完整的代码实现:
```python
def circular_shift(array, m):
# 将前m个数放到数组末尾
array = array[m:] + array[:m]
n = len(array)
# 将剩下的n-m个数依次向后移动m个位置
for i in range(n - m):
array[n - i - 1] = array[n - i - m - 1]
# 将移出的数从开头移入
for i in range(m):
array[i] = array[n - m + i]
return array
n, m = map(int, input().split())
array = list(map(int, input().split()))
result = circular_shift(array, m)
print(' '.join(map(str, result)))
```
在这个程序中,我们用input()函数来分别读取n和m,然后调用map()函数将输入的字符串转换成整数。再用list()函数将整数序列转换成列表。接下来调用circular_shift()函数进行循环后移操作,并将得到的结果打印出来。我们用join()函数将整数序列转换成字符串,并用空格分割输出。
执行这个程序时,输入如下的数列:
```
10 3
1 2 3 4 5 6 7 8 9 10
```
程序将输出以下的结果:
```
8 9 10 1 2 3 4 5 6 7
```
可以看到,原本在数组开头的前3个数已被移动到了数组末尾,剩余的7个数往后移动了3个位置。
### 回答3:
循环后移是一种常见的算法,它可以用来将一个数组或者链表中的元素向后移动指定的位置,其大致的思路是先将需要移动的元素放到一个临时数组中,然后将后面的元素逐一往前移动,最后将临时数组中的元素复制回去。以下是一种基于数组的循环后移算法的实现:
```
void ShiftArray(int array[], int n, int m)
{
int* temp = new int[m];
for (int i = 0; i < m; i++) {
temp[i] = array[i];
}
for (int i = m; i < n; i++) {
array[i - m] = array[i];
}
for (int i = n - m; i < n; i++) {
array[i] = temp[i - n + m];
}
delete[] temp;
}
```
以上代码采用三次循环实现,第一次将需要移动的元素放到临时数组中,第二次将后面的元素逐一往前移动,第三次将临时数组中的元素复制回去。其中,临时数组的长度为移动的位置数,因为需要将这些元素从前面移到后面,所以需要用数组的后面的位置来存储这些元素。由于数组的下标从0开始,因此第三次循环的起始位置为n-m,而数组的结束位置是n。在实际的程序中,可以通过修改函数签名和参数来适配不同的输入。对于链表的实现方式也类似,不过需要涉及到指针的操作。
阅读全文