1008 陣列元素迴圈右移問題 (20 分)
阿新 • • 發佈:2018-12-14
一個數組A中存有N(>0)個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移M(≥0)個位置,即將A中的資料由(A0A1⋯AN−1)變換為(AN−M⋯AN−1A0A1⋯AN−M−1)(最後M個數迴圈移至最前面的M個位置)。如果需要考慮程式移動資料的次數儘量少,要如何設計移動的方法?
輸入格式:
每個輸入包含一個測試用例,第1行輸入N(1≤N≤100)和M(≥0);第2行輸入N個整數,之間用空格分隔。
輸出格式:
在一行中輸出迴圈右移M位以後的整數序列,之間用空格分隔,序列結尾不能有多餘空格。
輸入樣例:
6 2
1 2 3 4 5 6
輸出樣例:
5 6 1 2 3 4
題意:
就是不斷地將n個數的最後一個數放到前面,迴圈m次。
例如:
6 2
1 2 3 4 5 6
第一次:6 1 2 3 4 5
第二次:5 6 1 2 3 4
6 8
1 2 3 4 5 6
第一次:6 1 2 3 4 5
第二次:5 6 1 2 3 4
第三次:4 5 6 1 2 3
第四次:3 4 5 6 1 2
第五次:2 3 4 5 6 1
第六次:1 2 3 4 5 6
第七次:6 1 2 3 4 5
第八次:5 6 1 2 3 4
可以看出k=8與k=2結果相同。8%6=2%6=2
所以如果k>n; k=k%n;
即將n個數的最後k個數移動到最前面。
程式碼:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { int n,k; int num[207]; scanf("%d%d",&n,&k); if(k>n) k=k%n; int sum=n+k; for(int i=1;i<=n;i++) { scanf("%d",&num[i]); } for(int j=0;j<=n;j++) //將n個數整體後移k個位置 num[sum-j]=num[n-j]; for(int i=1;i<=k;i++) //將後面的k個數放到前面 num[i]=num[n+i]; for(int i=1;i<=n;i++) { if(i!=1) printf(" "); printf("%d",num[i]); } return 0; }