PAT 1008 陣列元素迴圈右移問題 20

2021-08-15 17:52:25 字數 969 閱讀 9015

題目描述:

乙個陣列a中存有n(n>0)個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m(m>=0)個位置,即將a中的資料由(a0a1……an-1)變換為(an-m …… an-1 a0 a1……an-m-1)(最後m個數迴圈移至最前面的m個位置)。如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方法?

輸入格式:每個輸入包含乙個測試用例,第1行輸入n ( 1<=n<=100)、m(m>=0);第2行輸入n個整數,之間用空格分隔。

輸出格式:在一行中輸出迴圈右移m位以後的整數序列,之間用空格分隔,序列結尾不能有多餘空格。

輸入樣例:

6 2

1 2 3 4 5 6

輸出樣例:
5 6 1 2 3 4
題目分析:

n個陣列元素迴圈右移m個位置。 即先將【n-m,n】序列反轉。再將【0,n-m】反轉,最後將整個陣列【0,n】反轉。讀者可以在草稿紙上寫一串陣列按照這個方式模擬一邊,能更好的理解。此題目有乙個陷阱就是:m的值可能比元素數量n還要大,易知將n個元素迴圈右移n個位置,陣列不變。那麼這種情況下只需m=m%n即取餘數。

**如下:

#include

//本演算法實現n個陣列元素迴圈右移m個位置。 即先將【n-m,n】序列反轉。再將【0,n-m】反轉,最後將整個陣列反轉。 

#include

using namespace std;

void rev(int *left,int *right)

}int main()

rev(arr+num-m,arr+num); //反轉前半段 

rev(arr,arr+num-m);        //反轉後半段 

rev(arr,arr+num);       //反轉整個陣列。 

for(int i=0;iif(i!=num-1)

else printf("%d",arr[i]);}} 

PAT 1008 陣列元素迴圈右移問題

乙個陣列a中存有n n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m m 0 個位置,即將a中的資料由 a0 a1 an 1 變換為 an m an 1 a0 a1 an m 1 最後m個數迴圈移至最前面的m個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方法?輸入...

PAT 1008 陣列元素迴圈右移問題

個陣列a中存有n n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m m 0 個位置,即將a中的資料由 a0a1 an 1 變換為 an m an 1 a0 a1 an m 1 最後m個數迴圈移至最前面的m個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方法?輸入格式...

PAT 1008 陣列元素迴圈右移問題

乙個陣列a中存有n n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m m 0 個位置,即將a中的資料由 a0a1 an 1 變換為 an m an 1 a0 a1 an m 1 最後m個數迴圈移至最前面的m個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方法?輸入格...