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