自测-3 数组元素循环右移问题 (20分)

题目:
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A​0​​A​1​​⋯A​N−1​​)变换为(A​N−M​​⋯A​N−1​​A​0​​A​1​​⋯A​N−M−1​​)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4

解题思路:首先,定义两个一维数组,一个来储存控制台输入的数字,另一个存放移动后的数字,另外,定义一个函数int zhuanhuan(int a,int b,int c),用来计算任意一组a个数字,在第b个位置上的数字,右移c次后的新的位置。移动完之后,就可以把新的数组填充,再输出即可。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a,b,i,j;
    scanf("%d %d",&a,&b);
    int c[100];
    int d[100]={0};
    for(i=0;i<a;i++)
    {
        scanf("%d",&c[i]);
    }
    for(i=0;i<a;i++)
    {
        d[zhuanhuan(a,i+1,b)-1]=c[i];//将转换后的数字存入对应位置的数组中
    }
    printf("%d",d[0]);
    for(i=1;i<a;i++)
    {
        printf(" %d",d[i]);
    }
    return 0;

}
int zhuanhuan(int a,int b,int c)//给定转换数组的长度、要转换的位置、转换长度---》计算转换后的位置
{
    if(b+c<=a)//移动的位数+本身的位数<总长
    {
            return b+c;
    }
    else if(b+c>a&&(b+c)%a==0)//移动的位数+本身的位数<总长 且 移动的位数+本身的位数%总长==0
    {
        return a;
    }

    else if(c>a&&c%a==0)//移动的位数>总长 且 移动的位数%总长==0
    {
        return b;
    }
    else
    {
        return (b+c)%a;//剩下的:移动的位数<总长
    }
}

发布了24 篇原创文章 · 获赞 11 · 访问量 3179

猜你喜欢

转载自blog.csdn.net/qq_44292472/article/details/104428726