| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 12943 人关注过本帖, 1 人收藏
标题:数组循环右移
只看楼主 加入收藏
小可爱0920
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2016-12-18
结帖率:90%
收藏(1)
已结贴  问题点数:8 回复次数:10 
数组循环右移
本题要求实现一个对数组进行循环右移的简单函数:一个数组aa中存有nn(>0>0)个整数,将每个整数循环向右移mm(\ge 0≥0)个位置,即将aa中的数据由()变换为()(最后mm个数循环移至最前面的mm个位置)。

输入
输出
样例输入
6 2
1 2 3 4 5 6
样例输出
5 6 1 2 3 4
2016-12-20 16:30
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:3 
程序代码:
void fun(int a[], int n, int m)
{
    int s[m];

    for (int i = 0; i < m; ++i)
    {
        s[i] = a[i];
    }
    for (int i = 0; i < n - m; ++i)
    {
        a[i] = a[i + m];
    }
    for (int i = n - m; i < n; ++i)
    {
        a[i] = s[i + m - n];
    }
}


[fly]存在即是合理[/fly]
2016-12-20 18:09
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:3 
我记得有种做法不用另外数组保存数据~这不是像分段的冒泡法排序没么~只不过不同的是每次抽取nn-mm个元素,不分大小地交换位置罢了~记得这是一条典型习题~
本题只需交换8次即可~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-20 19:42
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:3 
以下是引用九转星河在2016-12-20 19:42:18的发言:

我记得有种做法不用另外数组保存数据~这不是像分段的冒泡法排序没么~只不过不同的是每次抽取nn-mm个元素,不分大小地交换位置罢了~记得这是一条典型习题~
本题只需交换8次即可~

从右往左滚mm回。
#include<stdio.h>
int main()
{
    int i, j, a[]={1,2,3,4,5,6};
    int m=2, n=sizeof(a)/sizeof(int);
    for (i=0; i<m; i++)
    {
        for (j=n-1; j>0; j--)
        {
            a[j] ^= a[j-1];
            a[j-1] ^= a[j];
            a[j] ^= a[j-1];
        }
    }
    for (i=0; i<n; i++)
        printf("%d",a[i]);
}
2016-12-20 20:56
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
话说这题和某个加精贴的字符串循环移位的情况有点像~

https://bbs.bccn.net/viewthread.php?tid=330825&extra=page%3D1%26amp%3Bfilter%3Ddigest

那种方法的交换次数较小,可以学习一下~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-20 21:51
小可爱0920
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2016-12-18
收藏
得分:0 
回复 3楼 九转星河
#include <stdio.h>
#define MAXN 10

int ArrayShift( int a[], int n, int m );

int main()
{
    int a[MAXN], n, m;
    int i;

    scanf("%d %d", &n, &m);
    for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);

    ArrayShift(a, n, m);

    for ( i = 0; i < n; i++ ) {
        if (i != 0) printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");

    return 0;
}

/* 你的代码将被嵌在这里 */
这个下面的子函数要怎么写    要求保存在原数组a中
2016-12-20 22:52
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 6楼 小可爱0920
用4楼的方法~不过是在调用函数里实现罢了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-20 23:17
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用九转星河在2016-12-20 21:51:04的发言:

话说这题和某个加精贴的字符串循环移位的情况有点像~

https://bbs.bccn.net/viewthread.php?tid=330825&extra=page%3D1%26amp%3Bfilter%3Ddigest

那种方法的交换次数较小,可以学习一下~

也可不用循环语句,用块移动。
2016-12-21 06:02
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 8楼 吹水佬
麻烦可不可以写一下用块移动的代码,我也想学习一下哩~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-21 07:12
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 9楼 九转星河
就是memmove
#include <stdio.h>
#include <string.h>
int main()
{
    int i, a[6]={1,2,3,4,5,6}, b[6];
    memmove(b, a+4, 2*sizeof(int));
    memmove(b+2, a, 4*sizeof(int));
    for (i=0; i<6; i++)
        printf("%d",b[i]);
}
2016-12-21 11:32
快速回复:数组循环右移
数据加载中...
 
   



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

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