![在这里插入图片描述](https://img-blog.csdnimg.cn/2020021511310398.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExOTIwOTkzMTY1,size_16,color_FFFFFF,t_70)
注意点
- 此类题可以考虑直接输出,该题先输出n-m号元素到n-1号元素,再输出0到n-m-1号元素
- 除了直接输出法还可以使用最大公约数法和Reverse法,其中最大公约数法可以使移动次数最小,Reverse法也很简洁方便
直接输出法
#include <bits/stdc++.h>
using namespace std;
int main(){
int A[101];
int n,m;
scanf("%d%d",&n,&m);
m%=n;
for(int i=0;i<n;i++){
scanf("%d",&A[i]);
}
for(int k=n-m;k<n;k++){
printf("%d ",A[k]);
}
for(int j=0;j<n-m;j++){
printf("%d",A[j]);
if(j!=n-m-1)printf(" ");
}
return 0;
}
Reverse法
#include<bits/stdc++.h>
using namespace std;
int a[110];
void reverse(int i,int j){
while(i<j){
int temp=a[i];
a[i++]=a[j];
a[j--]=temp;
}
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)scanf("%d",&a[i]);
m=m%n;
reverse(0,n-m-1);
reverse(n-m,n-1);
reverse(0,n-1);
for(int i=0;i<n;i++){
printf("%d",a[i]);
if(i!=n-1)printf(" ");
}
return 0;
}
最大公约数法
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
if(b==0) return a;
else return gcd(b,a%b);
}
int main(){
int a[110];
int n,m,temp,pos,next;
cin>>n>>m;
for(int i=0;i<n;i++)scanf("%d",&a[i]) ;
m=m%n;
if(m!=0) {
int d=gcd(m,n);
for(int i=n-m;i<n-m+d;i++){
temp=a[i];
pos=i;
do {
next=(pos-m+n)%n;
if(next!=i) a[pos]=a[next] ;
else a[pos]=temp;
pos=next;
}while(pos!=i);
}
}
for(int i=0;i<n;i++){
printf("%d", a[i]);
if(i<n-1) printf(" ");
}
return 0;
}