PAT乙级练习总结
PAT乙级 1008 数组元素循环右移问题 (20 分) 希望我的思路可以帮助你。1008 数组元素循环右移问题 (20 分)
输入格式:每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
二、代码
#include<stdio.h>
#define MAXS 10000
int main(){
int m,n,i;
scanf("%d %d",&n,&m);
int num[n];
for(i=0;i<n;i++){
scanf("%d",&num[i]);
}
if(m%n==0||m==0){
shuchu(n,num);
}
else{
m=m%n;
fan(0,n-1,num);
fan(0,m-1,num);
fan(m,n-1,num);
shuchu(n,num);
}
return 0;
}
void fan(int star,int end,int num[]){
int t;
while(star<end){
t=num[star];
num[star]=num[end];
num[end]=t;
star++;end--;
}
}
void shuchu(int n,int num[]){
int i;
printf("%d",num[0]);
for(i=1;i<n;i++){
printf(" %d",num[i]);
}
}
总结
右移m位相当于全体翻转,然后前m个翻转,剩下的翻转。需要注意到右移m个可能是数组长度的倍数,所以等于原来的数组。或者m大于数组长度,可以先对m取余判断右移几位。例如 输入 6 2
1 2 3 4 5 6
先全部翻转:6 5 4 3 2 1
再翻转前m个:5 6 4 3 2 1
再翻转剩下的:5 6 1 2 3 4