题目
一个数组
A
A
A中存有
N
(
>
0
)
N(>0)
N(>0) 个整数,在不允许使用另外数组的前提下,将每个整数循环向右移
M
(
≥
0
)
M(≥0)
M(≥0) 个位置,即将
A
A
A 中的数据由
(
A
0
A
1
.
.
.
A
N
−
1
)
( A_0 A_1 ... A_{N-1})
(A0A1...AN−1) 变换为
(
A
N
−
M
.
.
.
A
N
−
1
A
0
A
1
.
.
.
A
N
−
M
−
1
)
(A_{N-M} ...A_{N-1} A_0 A_1...A_{N-M-1})
(AN−M...AN−1A0A1...AN−M−1) (最后
M
M
M 个数循环移至最前面的
M
M
M 个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式
每个输入包含一个测试用例,第 1 1 1 行输入 N ( 1 ≤ N ≤ 100 ) N(1≤N≤100) N(1≤N≤100) 和 M ( ≥ 0 ) M(≥0) M(≥0) ;第 2 2 2 行输入 N N N 个整数,之间用空格分隔。
输出格式
在一行中输出循环右移 M M M 位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例
6 2
1 2 3 4 5 6
输出样例
5 6 1 2 3 4
其它要求
代码长度限制:16 KB
时间限制:400 ms
栈限制:8192 KB
内存限制:64 MB
题解
解题思路
根据题目要求,输入相应的数据。然后确定 M M M 的值,因为 M M M 可能大于 N N N,所以先令 M = M % N M = M \% N M=M%N ,然后得到可以直接使用的 M M M。首先对 M M M 进行,如果 M M M 为 0 0 0 ,直接顺序输出。反之,则先逆序输出第 M M M 至 N N N 位置数字,然后顺序输出余下数字即可。注意每个数字之间用空格分隔,序列结尾不能有多余空格。
完整代码
#include<iostream>
using namespace std;
void outPut(int N, int M, int Num[]) // 打印结果
{
int i;
if (M == 0)
{
for (i = 0; i < N - 1; i++)
{
cout << Num[i] << " ";
}
}
else
{
for (i = N - M; i < N; i++)
{
cout << Num[i] << " ";
}
for (i = 0; i < N - M - 1; i++)
{
cout << Num[i] << " ";
}
}
cout << Num[i];
}
int main(void)
{
int N, M;
int Num[101];
cout << "请输入 N 和 M:"; // 提交时注释此行
cin >> N >> M;
cout << "请输入 " << N << " 个数字:"; // 提交时注释此行
for (int i = 0; i < N; ++i) {
cin >> Num[i];
}
M = M % N; // M 可能大于 N,所以先令 M = M % N
cout << "结果为:"; // 提交时注释此行
outPut(N, M, Num);
return 0;
}