PTA 乙级 1008 数组元素循环右移问题 (20分)

 用C语言写的,逐个移动每一位的位置实现右移

 1 #include<stdio.h>
 2 
 3 void swap(int* n, int count,int num) {
 4     int tmp = 0;
 5     int i = 0;
 6     int j = count - 2;
 7     for (i = 0; i < num; i++) {        //循环次数由右移位数决定    
 8         tmp = n[count - 1];            //储存最后一位,使最后一位前移 
 9         for (j = count - 2; j >= 0; j--) {
10             n[j + 1] = n[j];
11         }
12         n[0] = tmp;
13     }
14 }
15 
16 int main() {
17     int n[100];
18     int i = 0;
19     int count = 0, num = 0;
20     scanf("%d %d",&count,&num);
21     for (i = 0; i < count; i++) {
22         scanf("%d",&n[i]);
23     }
24     num = num % count;        //避免重复循环
25      
26     swap(n, count, num);
27     
28     printf("%d",n[0]);
29     for (i = 1; i < count; i++) {
30         printf(" %d",n[i]);
31     }
32     return 0;
33 }

 还挺快的

还有一种方法,利用C++ algorithm完成,具体思路是这样的:

先将输入得到的数组倒序

由于需要将每个整数循环向右移M个位置,则将倒序后的数组从第M项分割开,

分别进行倒序,则可得到右移后的数组

 利用algorithm里的reverse函数实现倒序

 代码如下:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<vector>
 4 
 5 using namespace std;
 6 
 7 int main() {
 8     int n = 0, c = 0;
 9     cin >> n >> c;
10     vector<int> arr(n);
11     for (int i = 0; i < n; ++i) {
12         cin >> arr[i];
13     }
14     c = c % n;            //避免重复循环
15 
16     reverse(arr.begin(), arr.end());    //开始倒序
17     reverse(arr.begin(), arr.begin() + c);
18     reverse(arr.begin() + c, arr.end());
19 
20     cout << arr[0];
21     for (int i = 1; i < arr.size(); i++) {
22         cout << " " << arr[i];
23     }
24     return 0;
25 }

 只能说,调库是个好东西

猜你喜欢

转载自www.cnblogs.com/SCP-514/p/13193679.html