PAT1008 数组元素循环右移问题

PAT1008 数组元素循环右移问题

易错点

循环右移的位数可能超过一个循环。不要盲目的用total减去循环右移的位数,要先用求余的方式把重复的循环去掉。

自创测试用例

测试用例
9 3
1 2 3 4 5 6 7 8 9
答案
7 8 9 1 2 3 4 5 6

测试用例
9 4
1 2 3 4 5 6 7 8 9
答案
6 7 8 9 1 2 3 4 5

测试用例
10 4
1 2 3 4 5 6 7 8 9 10
答案
7 8 9 10 1 2 3 4 5 6

测试用例
10 5
1 2 3 4 5 6 7 8 9 10
答案
6 7 8 9 10 1 2 3 4 5

测试用例
2 2
1 2
答案
1 2

测试用例
2 1
1 2
答案
2 1

测试用例
10 0
1 2 3 4 5 6 7 8 9 10
答案
1 2 3 4 5 6 7 8 9 10

测试用例(本例易错)
6 7
1 2 3 4 5 6
答案
6 1 2 3 4 5

代码(全部测试用例通过)

#include<iostream>
#define SWAP(a,b) {int temp;temp=a;a=b;b=temp;}
using namespace std;
int main()
{
	int total;
	int m, n;//循环右移m个位置

	cin >> total >> m;
	m = m % total;//m可能会大于total,即超出一个循环
	n = total - m;

	//输入数组
	int i;
	int a[100];
	for (i = 0; i < total; i++)
	{
		cin >> a[i];
	}

	//前n个交换
	for (i = 0; i < n / 2; i++)
	{
		SWAP(a[i], a[n - i - 1]);
	}

	//后m个交换
	for (i = 0; i < m / 2; i++)
	{
		SWAP(a[n + i], a[total - i - 1]);
	}

	//整体交换
	for (i = 0; i < total / 2; i++)
	{
		SWAP(a[i], a[total - i - 1]);
	}

	//输出
	for (i = 0; i < total; i++)
	{
		cout << a[i];
		if (i != total - 1)cout << ' ';
	}

	//system("pause");
	return 0;
}