问题描述
有n个整数,使前面各数顺序向后移n个位置,最后m个数变成最前面m个数。写一个函数实现以上功能,在主函数中输入n个整数,并输出调整后的n个数
算法解题
#include <iostream>
using namespace std;
int main()
{
void move (int *, int, int ); //函数声明
int n,m,i;
cout << "How many numbers will you input? The number is: ";
cin >> n; //输入数组元素的总数
int num[n];
cout << "Please input " << n << " numbers: " << endl;
for (i=0; i<n; i++)
{
cin >> num[i]; //遍历数组
}
cout << "How many places will you move? The number is: ";
cin >> m; //输入要移动的步数
move(num,n,m); //函数引用
cout << "The new order of the array is: " << endl;
for (i=0; i<n; i++)
{
cout << num[i] << " "; //输出调整后的数组
}
return 0;
}
void move (int *num,int n,int m)
{
int *p,lastnum;
lastnum = *(num+n-1); //保存数组中最后一个元素
for (p=num+n-1; p>num; p--)
{
*p = *(p-1); //从后往前,将前面的元素依次赋给后面的元素(1->2, 2->3, n-1 ->n)
}
//如此一来,最后一个元素就被覆盖了,但我们事先保存了最后一个元素的值
*num = lastnum;
//如今我们把最后一个元素的值赋给第一个元素,这样一来,就相当于,每个数都向后移动了一个位置
//然后最后的一个元素移动到第一个元素的位置上来,就完成了我们的移动任务。
m--;
//每完成一次移动,m减1
if (m>0) move(num,n,m); //当m>0时,再递归调用一次函数(即再移动一次)
//当m=0时,就不用再移动了(m减少的次数即为移动的步数)
}
代码中函数for循环中的执行过程如下图: