| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1822 人关注过本帖
标题:数组右移问题
只看楼主 加入收藏
ldsh304
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:242
专家分:755
注 册:2016-1-18
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
数组右移问题
一个数组A中存有N(N>0)个整数,在不允许使用其它数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1……AN-1)变换为(AN-M …… AN-1 A0 A1……AN-M-1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

我的思想是:先把数组后m个数和前m个数先交换,然后用递归
但是总是在 n-m < m 的时候用递归时有问题,怎样修改
#include <iostream>
using namespace std;
 
const int MaxSize = 100;
 
void swap(int &a, int &b)
{
    if(a == b)  return ;
    a ^= b;
    b ^= a;
    a ^= b;
}
 
/*
    n : 对n个数进行处理
 
    m : 要改变位置的m个数
 
    len : a[]的使用长度
 
   
 
*/
 
void reserve(int a[],int start,  int n, int m,const int len)
{
    cout << start <<endl;
    if (start + ((n-m > m)?m:(n-m))== len || n==m)//这里可能有问题
 
    {
        return ;
    }
    int i = start;
 
    if (m < n-m)
    {
        for (; i < start + m; i++)
        {
            cout << a[i] << "   <   " << a[n-m+i] << endl;
            swap(a[i], a[n-m+i]);//交换前m个后m个数
 
        }
        reserve(a, start+m,  n-m, m,len);
        
 
    }
    else if (m == n-m)
    {
        for (; i < m; i++)
        {
            cout << a[i] << "   =   " << a[m+i] << endl;
            swap(a[i], a[m+i]);//要处理的前m个数和后m个数正好是整个数组的元素
 
        }
    }
    else
    {
        
 
        for (; i < start + n - m; i++)
        {
            cout << a[i] << "   >   " << a[n-m+i] << endl;
            swap(a[i], a[n-m+i]);//交换前m个后m个数
 
        }
        reserve(a, start+n-m, m, m, len);//这里可能有问题
 
    }
   
 
}
 
int main()
{
    int n, m;
    int a[MaxSize];
    int i = 0;
    cin >> n >> m;
    for (; i < n; i++)
    {
        cin >> a[i];
    }
    m = m % n;
    if (m != n)
        reserve(a, 0, n, m,n);
   
 
    for (i = 0; i < n-1; i++)
    {
        cout << a[i] << " ";
    }
    cout << a[i] << endl;
    return 0;
}



[此贴子已经被作者于2016-10-29 19:07编辑过]

搜索更多相关主题的帖子: include return 如何 
2016-10-29 12:38
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10543
专家分:42958
注 册:2014-5-20
收藏
得分:10 
有点特别,这样做有什么优点(特点)?
重点好象是交换a,b。如:
a=a+b
b=a-b
a=a-b

2016-10-29 14:24
chain135cn
Rank: 2
等 级:论坛游民
帖 子:2
专家分:20
注 册:2016-10-20
收藏
得分:10 
本来发了一段,不过是错误的想法,就删了,没看到循环右移中的 循环二字。



[此贴子已经被作者于2016-10-29 16:46编辑过]

2016-10-29 16:42
ldsh304
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:242
专家分:755
注 册:2016-1-18
收藏
得分:0 
回复 2楼 吹水佬
a=a+b。。。
可能会发生溢出
使用异或好像问题
(除了两个数相等外)
2016-10-29 19:06
快速回复:数组右移问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015337 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved