编程珠玑之第二章习题5

问题描述:

 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,  02);
    myswap(arr, arraysize,  34);
    myswap(arr, arraysize,  511);
    myswap(arr, arraysize,  011);


     for ( int i =  0; i <  12; ++i)
    {
        printf( "%c\t", arr[i]);
    }

     return  0;
}
输出结果:


心得疑惑:

1、 一些数学的基本性质是解决实际问题算法的根本!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值