题目:
有n个整数,使其前面各数顺序向后移m个位置,移出的数再从头移入,使得最后m个数变成前面m个数。
例:设n为6, m为2,当n个数为{1,2,3,4,5,6},函数使之变为{5,6,1,2,3,4}
编写一个函数move,实现以上功能,该函数的声明如下:
void move(int *x,int n, int m)
实现思想:
- 拿出最后一个数,然后其他数字全部后移1位
- 把之前拿出的数,放在空出来的最前面(其实不是空的,但这个位置可以被覆盖)
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <malloc.h>
#include <errno.h>
void Move(int* p, int n, int m)
{
int i = 0;
int j = 0;
int tem = 0;
//如果m大于2,那么其实只有溢出来的部分使有意义的
//比如只有数列只有3位,要求排序4位
//那其实效果是 == 排序1位的
m %= n;
//循环m次,即排序m位
for (j = 0; j < m; j++)
{
tem = *(p + n - 1);//取出最后一位
//其余数字后移1位
for (i = n - 1; i >= 0; i--)//此时数组中最后一位已经拿走,所以循环n-1次
{
*(p + i) = *(p + i - 1);
}
*p = tem;//把之前拿出的数,放在最前面
}
}
int main()
{
int* p = NULL;
int input_n = 0;
int input_m = 0;
int i = 0;
printf("请输入n与m:");
scanf("%d %d", &input_n, &input_m);
//开辟input个空间 用来存放inout个整型
p = (int*)calloc(input_n, sizeof(int));
if (p == NULL)
{
perror("calloc");
return 1;
}
//输入数列
printf("请输入数列:");
for (i = 0; i < input_n; i++)
{
scanf("%d", p + i);
}
//处理
Move(p, input_n, input_m);
//输出
for (i = 0; i < input_n; i++)
{
printf("%d ", *(p + i));
}
free(p);
p = NULL;
return 0;
}