题目地址:PAT乙1008.数组元素循环右移问题(20)
题目描述:
一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A
0
A
1
……A
N-1
)变换为(A N-M …… A N-1 A 0 A 1 ……A N-M-1 )(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
解题过程:
这题可以用一个数组来存储输入的信息,然后通过判断移动的位置,从该下标开始打印,最后在把前面的补充打印即可。
程序:
#include <iostream>
using namespace std;
int arr[1000];
void solve(int N, int M)
{ /* 用于判断并输出结果 */
int k = N - M%N;
int j;
if (k == 0)
{ /* 如果等价于不移动,直接输出 */
for (j = k; j < N-1; ++j)
cout << arr[j] << " ";
cout << arr[j] << endl;
}
else
{
for (int i = k; i < N; ++i)
cout << arr[i] << " ";
for (int i = 0; i < k; ++i)
{
if (i+1 != k)
cout << arr[i] << " ";
else
cout << arr[i] << endl;
}
}
}
int main()
{
int N, M;
cin >> N >> M;
int num;
for (int i = 0; i < N; ++i)
{
cin >> num;
arr[i] = num;
}
solve(N, M);
return 0;
}