PAT乙級 1008 數組元素循環右移問題

在這裏插入圖片描述
同樣,寫給自己,以前只會再開一個數組和暴力右移,這次學到了新的方法,記錄一下。
有數組123456,要右移兩次,可以分成1234和56兩塊,兩塊都左右交換,變成4321和65,432165再左右交換即可變成561234(這步可以省略,直接在432165的情況下寫兩個for,從N-M~N和1~N-M-1輸出)。
證明(有錯歡迎指出)
設一個數組總共有N個數,要右移M位,有元素a,且a的下標爲i。那麼a最終位於i+M。
首先,將這個數組分爲0~(N-M-1)和(N-M)~N-1兩塊,在前半塊時,先左右交換,i就變爲N-M-1-i,再兩塊整體進行左右交換,i變爲N-(N-M-1-i)-1=M+i。

C

#include <stdio.h>
#pragma warning(disable:4996)
void reverse(int *a,int start,int end)
{
	for(;start<end;start++,end--)
	{
		a[start]^=a[end];    //一個交換數字的方法,證明請問度娘
		a[end]^=a[start];
		a[start]^=a[end];
	}
}
int main(void)
{
	int n,m,i,a[100];
	scanf("%d %d",&n,&m);
	m%=n;
	for(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(i=0;i<n;i++)
		printf(i==0?"%d":" %d",a[i]); //數組的最後不能有多於空格
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章