注册 登录
编程论坛 C++教室

新手求助。。。望指点哈。。

Jveryl 发布于 2010-11-22 17:03, 383 次点击
用指针操作将一个一维数组中的n个整数做以下处理:顺序将前面各数后移m个位置,使最后面的m个数变成最前面的m个数。


这个思路应该从哪里入手。。。谢谢
6 回复
#2
2010-11-22 20:58
最苯的方法  就是开辟一个新的数组  然后把后边M个元素读入进新的数组   然后在把前边N个也读进来   如果有剩余的   就继续读剩余的

然后把这个新数组的内容重写回去


HOHO这个方法比较恶心  但绝对好使
#3
laoyang1032010-11-22 22:34
#include<iostream>
using namespace std;

void main()
{
    int m,j,i,t;
    cin>>m;
    int a[20]={0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0,0,0};
    for(i=9;i>0;i--)
        a[i+m]=a[i];
    for(j=9+m;j>9;j--)
        a[j-9]=a[j];
    for(int k=0;k<20;k++)
        cout<<a[k]<<" ";
}应该可以
#4
laoyang1032010-11-22 22:46
#include<iostream>
using namespace std;

void main()
{
    int m;
    cin>>m;
    int a[20]={0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0,0,0};
    for(int *i=a+9;i>a;i--)
        *(i+m)=*i;
    for(int *j=a+9+m;j>a+9;j--)
        *(j-9)=*j;
    for(int k=0;k<20;k++)
        cout<<a[k]<<" ";
}

看错了  指针的  道理是一样的  
#5
hoho5682010-11-23 10:28
楼上的故意把数组写大了,这样固然是一种解决方法,可是如果数组的大小是正好合适的呢。
#6
hoho5682010-11-23 10:52
如果单纯用指针的话,是不是可以采用递归。。用指针P开始指向数组第一位;操作是:每次把最后m个数和前面m个数互换位置;一直递归处理;
直到n-m <= m
#7
hoho5682010-11-23 11:18
程序代码:
#include<iostream>
using namespace std;

int change(int *p, int n, int m)
{
    int i,temp;
    if (n <=0 || m <= 0  )
        return 0;                  //当数组或者需要交互的数都为0时,结束递归!
    if (n-m > m)                //数组前面的数据个数大于m时,直接进行交互,并改变指针值,进入下次递归;
    {

        for (i =0; i < m; i++)
        {
            temp = p[i];
            p[i] = p[n-m+i];
            p[n-m+i] = temp;
        }
        p = p+m;
        change(p, n-m, m);
    }
    else                                 //当数组前面的数据小于m时,重新考虑数组,把m的值给成n-m,只交换一部分,然后再次进入递归!
    {
        for (i =0; i< n-m; i++)
        {
            temp = p[i];
            p[i] = p[n-m+i];
            p[n-m+i] = temp;
        }
        p = p+n-m;
        change(p, m,2*m-n);
    }

    return 0;
}
int  main()
{
    int m,i;
    int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    cout << "please input m:\n"<< endl;
    cin >> m;
    int *p;
    p = a;

    change(p, 10, m);
    for (i = 0; i< 10; i++)
        cout << a[i] << " " ;   //这里写a[i]和p[i]结果是一样的,就不多说了。。
    return 0;
   

}
采用递归,每次把最后m个数组和最前面的m个数互换,然后在对数组后面的n-m个数进行相同的操作;
需要注意的一点是n-m和m值的大小,影响数据的交换过程!


[ 本帖最后由 hoho568 于 2010-11-23 11:21 编辑 ]
1