PAT乙级1008. 数组元素循环右移问题(C语言)

AC

PAT乙级真题题解目录


/*
 * 1. 元素循环右移M位 可以转化为以下三步:
 *		1. 元素全部倒置;
 *		2. 前M个元素倒置;
 *		3. 之后的所有元素倒置;
 * 2. 数组部分元素倒置:可用数组下标标记 倒置范围
 * 3. 若右移的位数M超出元素数量N,等同于 右移 M % N 位
 */
#include <stdio.h>

void reverse(int *arr, int left, int right) {//倒置数组中部分元素的函数,参数依次为 数组,起始下标,终止下标
	int temp;
	for (int i = 0; i < (right - left + 1) / 2; i++) { 
		temp = arr[left+i];
		arr[left+i] = arr[right-i];
		arr[right-i] = temp; 
	}
} 
int main() {
	int N, M;//数组大小,右移位数 
	scanf("%d %d", &N, &M); 
	int arr[N];//创建数组 
	M = M % N;// 使 M < N,避免出错,达到同样的位移结果 
	for (int i = 0; i < N; i++) {//读入数字 
		scanf("%d", &arr[i]); 
	} 
	reverse(arr, 0, N-1);//倒置数组 
	reverse(arr, 0, M-1);//倒置前d个数 
	reverse(arr, M, N-1);//倒置之后的所有数  
	for (int i = 0; i < N; i++) {//输出
		if (i != 0) {
			printf(" ");
		}
		printf("%d", arr[i]);
	} 
	return 0; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值