セルフテスト-3配列要素サイクル右シフト問題

1368 ワード

1つの配列AにはN(>0)個の整数が格納されており、他の配列を使用することが許されないことを前提として、各整数をM(≧0)個の位置にループ移動し、A中のデータを(A 0 A 1⋯A N−1)から(A N−M⋯A N−1 A 0 A 1⋯A N−M−1)に変換する(最後にM個の数が一番前のM個の位置にループ移動する).プログラムがデータを移動する回数を最小限に抑える必要がある場合は、どのように移動方法を設計しますか?
入力形式:
各入力は1つの試験例を含み、1行目はN(1≦N≦100)とM(≧0)を入力する.2行目にN個の整数を入力し、間をスペースで区切ります.
出力フォーマット:
1行にMビットを右シフトした後の整数シーケンスを出力し、間をスペースで区切って、シーケンスの最後に余分なスペースを持つことはできません.
サンプルを入力:
6 2
1 2 3 4 5 6

出力サンプル:5 6 1 2 3 4
#include 
int main(void)
{
	int N, M, i, j, temp;
	int a[100];
	scanf("%d %d", &N, &M);
	for (i = 0; i < N; i++)
		scanf("%d", &a[i]);
	if (M > N && M % N != 0)
		M = M % N;
	else if (M > N&&M%N == 0)
		M = 0;
	else M = M;
		for (i = 0, j = N - M - 1; i < j; i++, j--)
		{
			temp = a[i];
			a[i] = a[j];
			a[j] = temp;
		}
		for (i = N - M, j = N - 1; i < j; i++, j--)
		{
			temp = a[i];
			a[i] = a[j];
			a[j] = temp;
		}
		for (i = 0, j = N - 1; i < j; i++, j--)
		{
			temp = a[i];
			a[i] = a[j];
			a[j] = temp;
		}
	for (i = 0; i < N - 1; i++)
		printf("%d ", a[i]);
	printf("%d", a[N - 1]);
	return 0;
}