循环后移:有 n 个整数,使前面各数顺序向后移 m 个位置,移出的数再从开头移入。编 写一个函数实现以上功能,在主函数中输入 n 个整数并输出调整后的 n 个数。试编写相应程序。
【样例输入】
5 2
1 2 3 4 5
【样例输出】
4 5 1 2 3
#include<stdio.h>
#include <stdlib.h>
void reverse(int*in,int start,int end){
while(start<end){
int temp=in[start-1];
in[start-1]=in[end-1];
in[end-1]=temp;
start++;
end--;
}
}
void h(int *in,int n,int m){
reverse(in,1,n);//先反转整个数组
reverse(in,1,m);//反转前m个元素
reverse(in,m+1,n);//反转从m+1到最后的元素
}
int main(){
int n;
scanf("%d",&n);
int*in=malloc(n*sizeof(int));
int m;
scanf("%d",&m);
for(int i=0;i<n;i++){
scanf("%d",&in[i]);
}
h(in,n,m);
for(int i=0;i<n;i++){
printf("%d ",in[i]);
}
return 0;
}
注意,反转的条件为start<end
因为start和end每一次循环都是同步改变(start++,end--)
而当start<end到临界情况时,进行这个循环后(这个循环也就是最后的一次反转)
start就会大于或者等于end
如果start大于end,说明元素总共是有偶数个,例如1 2 3 4,进行2和3的反转后,start就成了3,end就成了4,保证了全部元素的个数反转
如果start等于end,说明元素总数是有奇数个,例如1 2 3 4 5,进行2和4的反转后,start=end=3,反转单个元素毫无意义,也保证了全部元素的个数反转
对于包含n个元素的数组
如果i从0开始,i<n/2
那么当n为偶数,i会遍历一半
当n为奇数,i会遍历最中间的数据之前的所有数据(不含最中间的那个)
Comments NOTHING