您的位置:首页 > 编程语言

编程珠玑之第二章习题5

2015-01-10 19:05 134 查看
问题描述:

n元一维向量旋转问题数将向量ab变为ba。如何将向量abc变为cba? (这对交换非相邻内存块问题进行了建模)

问题解析:

1、这里需要用到一个重要的性质:CBA=(ArBrCr)r
如果想到这个性质,那么基本上问题就解决一半了!解决方案可以类似于QusetionB的解决方案3,见:

编程珠玑之第二章questionB: n元一维向量旋转问题

解决方案:

如果n=12, A = abc, B = de, C = fghijkl 那么有举例如下:

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

#include <cstdio>

#include <cstdlib> // srand, rand

#include <cassert> // assert

/************************************************************************/

// 函数名称:myswap

// 函数目的:反转arr索引在[index_a, index_b]之间的值

// 函数参数:arr:要交换的数组 arraysize:数组长度 index_a\index_b:数组索引

/************************************************************************/

void myswap(int* arr, int arraysize, int index_a, int index_b)

{

assert(index_a >= 0 && (index_b-index_a) >= 0 && index_b < arraysize);

int i = index_a, j = index_b;

for (; i <= j; i++, j--){

int temp = *(arr+i);

*(arr+i) = *(arr + j); *(arr + j) = temp;

}

return;

}

int main()

{

int arr[12] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'};

int arraysize = 12; // 数组长度

//假设 n=12, A = abc, B = de, C = fghijkl 则可以如下进行

myswap(arr, arraysize, 0, 2);

myswap(arr, arraysize, 3, 4);

myswap(arr, arraysize, 5, 11);

myswap(arr, arraysize, 0, 11);

for (int i = 0; i < 12; ++i)

{

printf("%c\t", arr[i]);

}

return 0;

}
输出结果:



心得疑惑:

1、 一些数学的基本性质是解决实际问题算法的根本!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: