B1008 陣列元素迴圈右移問題

2021-08-08 18:23:22 字數 1667 閱讀 4191

time limit:200ms memory limit:65 536kb             難度指數:★★★☆☆

題目描述

乙個陣列a中有n(n>0)個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m(m>=0)個位置,即將a中的資料由[

輸入格式

每個格式輸入包含乙個測試用例,第一行輸入n(1

<=n

<=100)、m(m>=0);第二行輸入n個整數,之間用空格分隔。

輸出格式

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

6 2

1 2 3 4 5 6

輸出樣例

5 6 1 2 3 4
思路分析對於這道題,第一步要讀懂題目,並且明確解題思想,題中雖然給了很多限制,但是實際上卻只是測試陣列迴圈右移之後得到的結果而已,對於這個過程我們並不用表示出來,我們心裡應該明確這個過程,如下面舉例,但是實際中的解題應該採用直接利用性質輸出答案的方法。

首先要明確並不是一定n>m,也有可能n比m小;然後要知道迴圈陣列的乙個重要性質,那就是「對於乙個有n個數的陣列來說,陣列的每乙個數都移動m個位置,等同於陣列裡的每個數都移動m%n個位置」,舉個例子:

假如一陣列有5個元素,[1 2 3 4 5]:

[4 5 1 2 3] //移動2次       2%5 = 2

[1 2 3 4 5] //移動5次       5%5 = 0

[4 5 1 2 3] //移動7次       7%5 = 2

[4 5 1 2 3] //移動12次     12%5 = 2

[4 5 1 2 3] //移動17次     17%5 = 2

所以對於乙個大小為5個元素的陣列來說,移動2次、7次、12次、17次都相當於移動2次,即移動m次的效果和移動m%n次的效果是一樣的。

然後,明白了原理之後,要注意審題,本題是將a中的資料由[

注意

①count的使用是為了處理最後乙個數字之後不輸出空格,只要達到n了,就無法輸出空格,這種格式上的細微差別在acm、pat、oj、ccf等要求是較為嚴格的,應該注意格式的表示;

②如果要按照題目的要求對原陣列進行操作的話,還有另外的方法,見之後更新的鏈結;

③m等於0時,可以直接輸出整個陣列,某些寫法要注意考慮這種情況。

//—————————————————————————————————————————

**

#include

int main()

for(i=n-m;iprintf("%d",a[i]); //輸出n-m到n-1號元素

count++;

if(count < n)

printf(" ");

}for(i =0;i < n-m;i++)

return

0;}

B1008 陣列元素迴圈右移問題

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 乙個陣列a中存有n n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m m 0 個位置,即將a中的資料由 a0a1 an 1 變換為 an m an 1 a0 a1 an m ...

B1008 陣列元素迴圈右移問題 (20 分)

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

1008 陣列元素迴圈右移問題

這個題如果只是為了得到正確答案的話,使用直接列印的方法是最簡單地。但是如何能真正實現陣列元素的迴圈移位呢?要注意的是 當移位次數k大於陣列長度n的時候,跟移位k k n的效果是一樣的。我能想到的方法是,每次向右移一位,移動n次,實現方法如下 include void shiftright int a...