12.12 利用反转函数进行循环后移

发布于 2024-12-12  58 次阅读


循环后移:有 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会遍历最中间的数据之前的所有数据(不含最中间的那个)

届ける言葉を今は育ててる
最后更新于 2024-12-16