题目描述
有n个整数,使前面各数的顺序向后移动m个位置,最后m个数变成最前面m个数,写一个函数实现其功能
输入格式
第一行 输入n
第二行 输入n个整数
第三行 输入移动m位
输入样例
5
1 2 3 4 5 6
2
输出样例
5 6 1 2 3 4
解法
代码示例
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
void move(int* arr, int, int);
int num[20], n, m, i;
printf("how many numbers?\n");
scanf("%d", &n);
printf("input %d numbers:\n", n);
for (i = 0; i < n; i++)
scanf("%d", &num[i]);
printf("how many place you want move?\n");
scanf("%d", &m);
if (m <= 0)
{
printf("m <=0 未移动数据!");
return 0;
}
move(num, n, m);
printf("Now,they are:\n");
for (i = 0; i < n; i++)
{
printf("%d ", num[i]);
}
printf("\n");
return 0;
}
//1 2 3 4 5 假设有5个数据,移动两次
//5 1 2 3 4
//4 5 1 2 3
void move(int* arr, int n, int m)
{
int* p, arr_end;
arr_end = *(arr + n - 1);//将最后一个元素保留
for (p = arr + n - 1; p > arr; p--)
*p = *(p - 1);//将前一个赋值给后一个,依次后移
*arr = arr_end;//将保留的最后一个值赋值给第一位
m--;//移动次数-1
if (m > 0)move(arr, n, m);//递归调用
}