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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a356337092/article/details/76904002

长度为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;  
}  

猜你喜欢

转载自blog.csdn.net/a356337092/article/details/76904002
今日推荐