數組循環右移 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; 
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM