会飞大王

导航

数组循环右移 C语言实现

题目:
本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置。

#include <stdio.h>
#define MAXN 10

int ArrayShift( int a[], int n, int m );

int main()
{
    int a[MAXN], n, m;
    int i;

    scanf("%d %d", &n, &m);
    for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);

    ArrayShift(a, n, m);

    for ( i = 0; i < n; i++ ) {
        if (i != 0) printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");

    return 0;
}

/* 你的代码将被嵌在这里 */

解法一(自己的笨办法)

int ArrayShift(a,n,m)
{
    m=m%n;
    int b = n-m;
    for(i=0;i<n;i++)
    {
	if(i+b<n)
	{
		printf("%d",a[i+b]);
	} else
	{
		printf("%d", a[i-m]);
	}
	
	if(i!=n-1)
	{
		putchar(' ');
	}
    }
}

解法二:(网上的办法)

数组 1 2 3 4 5 6 循环右移2位 将变成 5 6 1 2 3 4

a. 先将数组逆序变成 6 5 4 3 2 1,再将前两个逆序 5 6 | 4 3 2 1,最后将后四位数逆序 5 6 1 2 3 4
b. 观察可知1 2 3 4 和 5 6 的顺序在移位前后没有改变,只是位置交换了一下,所以等同于1 2 3 4 5 6 先划分为两部分1 2 3 4 | 5 6,然后将1 2 3 4逆序,再将5 6 逆序 得到 4 3 2 1 6 5,最后整体逆序 得到 5 6 1 2 3 4

//a:
void reverse(int *a,int s,int e)
{
    int i,t;
    for(i=s;i<=(e+s)/2;i++)
    {
        t = a[i];
        a[i]=a[e+s-i];
        a[e+s-i]=t;
    }
}

int ArrayShift(int a[],int n,int m)
{
    m = m%n;
    reverse(a,0,n-1); //全部逆序
    reverse(a,0,m-1); //逆序前m个
    reverse(a,m,n-1); //逆序后面的
    return 0;
}
  • 交换两个数还可以用:
void swap(char& a,char& b)
{
   a = a^b;
   b = a^b;
   a = a^b; 
}

posted on 2019-10-28 19:58  会飞大王  阅读(4888)  评论(0编辑  收藏  举报