0
点赞
收藏
分享

微信扫一扫

C语言解题 || 调整数列

题目:

有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. 拿出最后一个数,然后其他数字全部后移1位
  2. 把之前拿出的数,放在空出来的最前面(其实不是空的,但这个位置可以被覆盖)

代码实现:

#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;
}

运行结果:

C语言解题 || 调整数列_i++

举报

相关推荐

0 条评论