右の配列要素の問題を回転させます
アレイA、そこN(> 0)の整数であり、前提が整数のそれぞれ右サイクルM(≥0)の位置に、追加のアレイの使用を許可されていない、すなわちデータA(から0 1 ⋯ N. 1)(に変換され、N-M ⋯ N. 1- 0 Aは1 ⋯A N-M-1
)(前回のサイクル極端数MにMの位置の前に)。あなたは回数に移動する方法を設計する方法に、できるだけデータを移動するためのプログラムを検討する必要がある場合は?
入力フォーマット:
各入力は、テストケースを備え、第一の入力ラインN(1≤N≤100)とM(≥0)との間にスペースで分離された第2の入力ラインNの整数、。
出力フォーマット:
間のスペースで区切られた整数Mビットの出力円形の右列、後行の配列の端部は、余分なスペースを持つことができません。
サンプル入力:
6 2
1 2 3 4 5 6
出力例:
5 6 1 2 3 4
アイデア:
、ビット0〜M-1逆位次いで、全体の配列に対する第一の移動が設定され、右回転Mビットは、最初にM>その後の動きは、N回繰り返される、第1の剰余がM%N Mに割り当てされなければなりません〜N-1 Mビット位置が逆に設定されています。
コード:
#include <stdio.h>
void reverse(int a[],int low,int high);
int main()
{
int i,n,m;
scanf("%d %d",&n,&m);
int a[n];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
m=m%n;
if(m){
reverse(a,0,n-1);
reverse(a,0,m-1);
reverse(a,m,n-1);
}
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d",a[n-1]);
}
void reverse(int a[],int low,int high)
{
int temp;
while(low<high)
{
temp=a[low];
a[low++]=a[high];
a[high--]=temp;
}
}