长度为n的整数数组循环左移右移m位

来源:互联网 发布:网络教研课题结项 编辑:程序博客网 时间:2024/06/05 04:38

长度为n的整数数组循环左移m位
右移m相当于左移n-m

// pat.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <iostream>void MoveLeft(int a[],int n,int m);int _tmain(int argc, _TCHAR* argv[]){    int old[9]={1,2,3,4,5,6,7,8,9};    int *p;    int out[9];    MoveLeft(old,9,6);    for(int i=0;i<9;i++)    {        printf("%d\n",old[i]);    }    int a;    std::cin>>a;    return 0;}void MoveLeft(int a[],int n,int m){    int temp = a[0];    for(int i=0;i<n-1;i++)    {        a[i]=a[i+1];    }    a[n-1]=temp;    m--;    if(m>0)     MoveLeft(a,n,m);    else return;}

更美:
算法解释:
前(n-m)位数字直接向右移动m; i—-i+m
后m位数字 ;j—-j-(n-m)
一次reverse 把i—n-m-1-i
二次reverse 把j—2n-m-1-j
最后reverse得到结果

#include <stdio.h>  int a[100];  void reverse(int *a, int m, int n){      for (int i = m; i <= (m + n) / 2; i++){          int tmp = a[i];          a[i] = a[m + n - i];          a[m + n - i] = tmp;      }  }  int main(){      int n, m;      scanf("%d%d", &n, &m);      m %= n;      for (int i = 0; i < n; i++)          scanf("%d", &a[i]);      reverse(a, 0, n-m-1);      reverse(a, n-m, n-1);      reverse(a, 0, n-1);      for (int i = 0; i < n; i++)          printf("%d%s", a[i], (i-n+1?" ":"\n"));      return 0;  }  
阅读全文
1 0
原创粉丝点击