数组拓展6-4:数组循环右移

202321332001陈佳丽 软件23 2023-12-31 22:29:30

6-4 数组循环右移

 

本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a0​a1​⋯an−1​)变换为(an−m​⋯an−1​a0​a1​⋯an−m−1​)(最后m个数循环移至最前面的m个位置)。

函数接口定义:


 

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

其中a[]是用户传入的数组;n是数组的大小;m是右移的位数。函数ArrayShift须将循环右移后的数组仍然存在a[]中。

裁判测试程序样例:


 

#include <stdio.h>

#define MAXN 10

void 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;

}

 

/* 你的代码将被嵌在这里 */

输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4

1、我们可以先设一个数组来存放一下原来的数组,方便我们操作

2、 我们可以将右移分为两段

      后一段比较简单,直接加上右移的位数

      前一段则是将后面的往前放

 

void ArrayShift( int a[], int n, int m )
{
    int b[n];

    while(m>n){m-=n;}    //保证右移的位数在数组大小之内
    
    for(int i=0;i<n;i++)     //先存一下原来的数组
    {
        b[i]=a[i];
    }

    for(int i=m;i<n;i++)    //后一段
    {
        a[i]=b[i-m];
    }

    for(int i=0;i<m;i++)   //前一段
    {
        a[i]=b[n-m+i];
    }
}

...全文
136 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

212

社区成员

发帖
与我相关
我的任务
社区描述
程序设计基础课程教学群
c语言c++ 高校 福建省·厦门市
社区管理员
  • xmzq001
  • 鹿饮涧鸣
  • jiangxiaoju
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

请加入学习社区的软件23级同学修改社区昵称为学号+姓名,以便登记作业提交情况。

试试用AI创作助手写篇文章吧