題目描述:
乙個陣列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個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方法?輸入格...