1、数组左移右移(循环)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72void Output(const int* ar, int n) { for (int i = 0; i < n; ++i) { printf("%d ", ar[i]); } } void Right_Move_Array(int* ar, int n) { assert(ar != nullptr && n > 0); int tmp = ar[n-1]; for (int i = n-1; i > 0; --i) { ar[i] = ar[i - 1]; } ar[0] = tmp; } void Left_Move_Array(int* ar, int n) { assert(ar != nullptr && n > 0); int tmp = ar[0]; for (int i = 0; i < n-1; ++i) { ar[i] = ar[i + 1]; } ar[n-1] = tmp; } void Left_Move_Array_K(int* ar, int n, int k) { assert(ar != nullptr && n > 0); bool tag = k >= 0 ? true : false; if (tag) { k = k % n; for (int i = 0; i < k; ++i) { Left_Move_Array(ar, n); } } else { k = -k; k = k % n; for (int i = 0; i < k; ++i) { Right_Move_Array(ar, n); } } } void Right_Move_Array_K(int* ar, int n, int k) { Left_Move_Array_K(ar, n, -k); } int main() { const int n = 10; int ar[n] = { 10,9,8,7,6,5,4,3,2,1 }; int k = 0; printf("please enter a number:"); scanf_s("%d", &k); Right_Move_Array_K(ar, n, k); Output(ar, n); return 0; }
2、左移右移(逆置)
示例:
数组{12,23,34,45,56,67,78,89,90,100}左移三位。
第一步:左三位数逆置,{34,23,12,45,56,67,78,89,90,100}。
第二步:右七位数逆置,{34,23,12,100,90,89,78,67,56,45}。
第三步:整体逆置,{45,56,67,78,89,90,100,12,23,34}。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71#include<stdio.h> #include<stdlib.h> #include<string.h> #include<assert.h> void Output(const int* ar, int n) { for (int i = 0; i < n; ++i) { printf("%d ", ar[i]); } } void Move(int* br, int l, int r) { int tmp = 0; int i = 0; int j = 0; for (i = l,j = r; i < j; ++i, --j) { tmp = br[i]; br[i] = br[j]; br[j] = tmp; } } //左移右移 void Reverse_Array(int* ar, int n,int k) { int tag = 1; int left = 0; int right = n - 1; assert(ar != nullptr && n > 0); if (k < 0) { k = -k; tag = 0; } k = k % n; if (tag) { Move(ar, left, k - 1); Move(ar, k, right); Move(ar, 0, n-1); } else { Move(ar, left, n - k - 1); Move(ar, n - k, right); Move(ar, 0, n - 1); } } int main() { const int n = 10; int ar[n] = { 10,9,8,7,6,5,4,3,2,1 }; int k = 0; printf("please enter a number:"); scanf_s("%d", &k); Reverse_Array(ar, n, k); Output(ar, n); return 0; }
3、左移右移(用递归方法写的逆置)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39void Swap_Int(int *ap,int *bp) { int tmp = *ap; *ap = *bp; *bp = tmp; } void ReverseAr(int* br, int left, int right) { while(left < right) { Swap_Int(&br[left++], &br[right--]); } return; } void Left_Move_Array_K(int* br, int n, int k) { assert(br != nullptr); k = k % n; ReverseAr(br, 0, k - 1); ReverseAr(br, k, n - 1); ReverseAr(br, 0, n - 1); } int main() { const int n = 10; int ar[n] = { 12,23,34,45,56,67,78,89,90,100 }; int k = 3; Left_Move_Array_K(ar, n, k); for (int i = 0; i < n; ++i) { printf("%d ", ar[i]); } return 0; }
4、左移右移(结构体)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65#include<stdio.h> #include<assert.h> //用结构体写的左移右移 #define ARSIZE 10 struct MoveArray { int data[ARSIZE]; int curpos; int maxsize; }; int GetElem(struct MoveArray* par, int pos) { return par->data[(pos + par->curpos) % par->maxsize]; } void Print_Ar(struct MoveArray* par) { for (int i = 0; i < par->maxsize; ++i) { printf("%d ", GetElem(par, i)); } printf("n"); } void Left_Move_K(struct MoveArray* par, int k) { par->curpos = k; Print_Ar(par); } void Right_Move_K(struct MoveArray* par, int k) { par->curpos = par->maxsize - k; Print_Ar(par); } void Init_MoveAr(struct MoveArray* par, int k) { if (k > 0) { Left_Move_K(par,k); } else { k = -k; Right_Move_K(par, k); } } int main() { MoveArray ar = { 12,23,34,45,56,67,78,89,90,100,0,ARSIZE }; int k = 0; printf("please enter a number:"); scanf_s("%d", &k); Init_MoveAr(&ar, k); return 0; }
定义一个结构体,结构体包括:数组、起始位置、数组大小。
初始中起始位置为0,即从数组的第一个数字进行读取。
如果左移三位,则起始位置向右移三位,即从数组的第三个数字进行读取,当读取到数组末尾时,起始位置(3)加上读取的第几位数(8),再对数组大小取余((3+8)%10=1),这样读取的数就转到数组的第一个数了。(右移同理)
最后
以上就是呆萌鸡翅最近收集整理的关于数组左移右移1、数组左移右移(循环)2、左移右移(逆置)3、左移右移(用递归方法写的逆置)4、左移右移(结构体)的全部内容,更多相关数组左移右移1、数组左移右移(循环)2、左移右移(逆置)3、左移右移(用递归方法写内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复