アルゴリズム基礎練習1:配列要素ループ右シフト問題


题目:1つの配列AにはN(>0)個の整数が存在し、他の配列を使用することが許されない前提の下で、各整数サイクルをM(≧0)個の位置に右にシフトし、A中のデータを(A 0,A 1,...AN-1)から(AN-M,...AN-1,A 0,A 1,...AN-M-1)に変換する(最後のM個の数サイクルが一番前のM個の位置にシフトする).プログラムがデータを移動する回数を最小限に抑える必要がある場合は、どのように移動方法を設計しますか?
入力フォーマット:各入力は1つのテスト例を含み、1行目はN(1≦N≦100)とM(≧0)を入力する.2行目にN個の整数を入力し、間をスペースで区切ります.
≪出力フォーマット|Output Format|emdw≫:1行にMビットを右にシフトした後の整数シーケンスを出力します.間はスペースで区切られ、シーケンスの最後に余分なスペースは使用できません.
サンプルを入力:
6 2 1 2 3 4 5 6出力サンプル:
5 6 1 2 3 4
考え方:1.まずM番目のビットから配列2にデータを入力.配列の後Mビットは、前Mビット3に一度移動する.複雑度:N;
#include "stdio.h"

void main()
{
	int N, M;
	scanf("%d %d 
",&N,&M); int a[10000]; for(int i = 0;i < N; i++) { scanf("%d",a+i+M); } for(int k = 0;k < M; k++) { a[M-k-1]=a[N+M-k-1]; } for(int j = 0;j < N; j++) { printf(" %d",a[j]); } }