PAT1008の配列要素は、適切な質問を回転させます

右の配列要素の問題を回転させます

アレイA、そこN(> 0)の整数であり、前提が整数のそれぞれ右サイクルM(≥0)の位置に、追加のアレイの使用を許可されていない、すなわちデータA(から0 1N. 1)(に変換され、N-MN. 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;
    }
}

おすすめ

転載: blog.csdn.net/weixin_42037611/article/details/92586905